Ошибка компилятора: неверное преобразование из int * в unsigned int * [-fpermissive]
У меня сегодня самая странная проблема. Я работал с примером в Интернете, и, к моему удивлению, это не сработало(они почти никогда не делают), Я решил исправить это сам, но, похоже, застрял на этой ошибке:
Error: Invalid Conversion from int* to unsigned int* [-fpermissive]
Это я поняла. Я предоставляюint*
Хочетunsigned int*
, Тем не менее, я на самом деле не знаю,Зачем int*
генерируется.
Вот фрагмент кода, бросающий проблему:
unsigned char md_value[EVP_MAX_MD_SIZE];
int md_length;
EVP_DigestFinal_ex(md_ctx, md_value, &md_length);
Третий аргумент этого вызова функции,&md_length
, вызывает проблему. Просматривая документацию для вызова этой функции(Из OpenSSL, если это имеет значение), он ожидает, что аргументunsigned int*
тип, который делает с тех пор, потому что он хочет адрес(или, по крайней мере, так, как это использует пример, с которым я работаю).
Самое смешное, я думал, что&
оператор вернулunsigned int*
, как возвращениеint*
не имеет смысла, поскольку компьютеры не имеют отрицательных адресов в своей памяти.
Вот пример, которому я следую, если вы хотите взглянуть:https://www.openssl.org/docs/crypto/EVP_DigestInit.html
Ниже приведен исходный код, если вы хотите попробовать его самостоятельно. Я сомневаюсь, что вам на самом деле нужно прочитать его, чтобы решить эту проблему, но наличие этого здесь не повредит.
Исходный код:
//* 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;
}
Кроме того, положив явное приведение(unsigned int*)
кажется, только усугубляет ситуацию, так как я получаю следующую ошибку:
example.cpp:(.text+0x91): undefined reference to `OpenSSl_add_all_digests`
...
example.cpp:(.text+0x1ec): undefined reference to `EVP_cleanup`
В основном, он жалуется на все функции OpenSSL.
И, наконец,(опять же, это просто, чтобы дать вам, ребята, все, что вам может понадобиться) Я не посылаю никаких забавных аргументов компилятору. Я просто использую:
gcc example.cpp -o example.out
Так как есть ошибка,example.out
на самом деле никогда не создается.