Compiler-Fehler: Ungültige Konvertierung von int * nach unsigned int * [-fpermissive]
Ich habe heute das seltsamste Problem. Ich habe online mit einem Beispiel gearbeitet und zu meiner Überraschung hat es nicht funktioniert (sie tun so ziemlich nie). Ich habe es selbst repariert, aber ich scheine bei diesem Fehler festzustecken:
Error: Invalid Conversion from int* to unsigned int* [-fpermissive]
Ich verstehe das. Ich biete einint*
, es will einunsigned int*
. Allerdings weiß ich eigentlich nichtWaru dasint*
wird generiert.
Hier ist der Code, der das Problem auslöst:
unsigned char md_value[EVP_MAX_MD_SIZE];
int md_length;
EVP_DigestFinal_ex(md_ctx, md_value, &md_length);
Das dritte Argument dieses Funktionsaufrufs,&md_length
, verursacht das Problem. Schauen Sie sich die Dokumentation für diesen Funktionsaufruf an (Von OpenSSL, wenn es darauf ankommt), erwartet das Argument vonunsigned int*
Typ, der da macht, weil er eine Adresse will (oder zumindest, wie das Beispiel, mit dem ich arbeite, es verwendet).
Lustige Sache ist, ich dachte, dass die&
operator hat ein @ zurückgegebunsigned int*
, als Rückgabe einesint*
ergibt keinen Sinn, da Computer keine negativen Adressen im Speicher haben.
Ist hier das Beispiel, das ich zusammen mit folge, wenn Sie einen Blick werfen möchten:https: //www.openssl.org/docs/crypto/EVP_DigestInit.htm
Below ist der Quellcode, falls Sie ihn selbst ausprobieren möchten. Ich bezweifle, dass Sie es tatsächlich lesen müssen, um dieses Problem zu lösen, aber es kann nicht schaden, wenn Sie es hier haben.
Quellcode
//* Description *//
// Title: Example
// Author: Boom Blockhead
// Example Program to Test OpenSSL
//* Libraries *//
#include <stdio.h>
#include <cstring>
#include <openssl/evp.h>
//* Namespaces *//
using namespace std;
//* Main Method *//
// Runs the Program and Interprets the Command Line
int main(int argc, char* argv[])
{
// Initialize the Messages
char msg1[] = "Test Message\n";
char msg2[] = "Hello World\n";
// Validate Argument Count
if(argc != 2)
{
, printf("Usage: %s digestname\n", argv[0]);
exit(1);
}
// Determine Message Digest by Name
OpenSSL_add_all_digests();
const EVP_MD* md = EVP_get_digestbyname(argv[1]);
// Make sure a Message Digest Type was Found
if(md == 0)
{
printf("Unknown Message Digest %s\n", argv[1]);
exit(1);
}
// Create the Message Digest Context
EVP_MD_CTX* md_ctx = EVP_MD_CTX_create();
// Setup the Message Digest Type
EVP_DigestInit_ex(md_ctx, md, NULL);
// Add the Messages to be Digested
EVP_DigestUpdate(md_ctx, msg1, strlen(msg1));
EVP_DigestUpdate(md_ctx, msg2, strlen(msg2));
// Digest the Message
unsigned char md_value[EVP_MAX_MD_SIZE];
int md_length;
EVP_DigestFinal_ex(md_ctx, md_value, &md_length); // <--- ERROR
// Destroy the Message Digest Context
EVP_MD_CTX_destroy(md_ctx);
// Print the Digested Text
printf("Digest is: ");
for(int i = 0; i < md_length; i++)
printf("%02x", md_value[i]);
printf("\n");
// Clean up the Message Digest
EVP_cleanup();
// Exit the Program
exit(0);
return 0;
}
Auch die explizite Besetzung von(unsigned int*)
scheint die Sache nur noch schlimmer zu machen, da ich dann den folgenden Fehler erhalte:
example.cpp:(.text+0x91): undefined reference to `OpenSSl_add_all_digests`
...
example.cpp:(.text+0x1ec): undefined reference to `EVP_cleanup`
rundsätzlich beschwert es sich über alle OpenSSL-Funktione
Zuletzt, (Auch dies ist nur, um euch alles zu geben, was ihr braucht) Ich sende keine witzigen Argumente an den Compiler. Ich benutze nur:
gcc example.cpp -o example.out
Seit es einen Fehler gibt, wird dasexample.out
wird eigentlich nie erstellt.