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.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage