Char Указатель Возвращаемое значение Мусор - PullRequest
2 голосов
/ 11 февраля 2012

Я хочу использовать функцию SHA1 из библиотек Linux ( документация ), которая возвращает указатель без знака. Как я понимаю, это создает новый массив, но разве это не значит, что я должен освободить память, используемую для него? И как мне узнать, использовать ли мне free или delete []? Я предполагаю, что эта конкретная функция использует способ выделения памяти на C, но как мне узнать в целом? Некоторые функции C ++ возвращают массивы символов вместо std :: string.

Ответы [ 4 ]

4 голосов
/ 11 февраля 2012

Имейте в виду, что, хотя он мог бы выделить память в куче, используя malloc, он также мог бы возвращать указатель на статический массив фиксированной длины, частный для области действия функции. Это не является нетипичным для библиотечных функций в Linux, особенно для тех, которые не используются повторно. Поэтому, если вы вызовете free() для указателя, который указывает на статический массив, вы получите какое-то неопределенное поведение.

Например, из этого сегмента документации для SHA1():

SHA1 () вычисляет дайджест сообщения SHA-1 из n байтов в d и помещает его в md (в котором должно быть место для SHA_DIGEST_LENGTH == 20 байт вывода). Если md равен NULL, дайджест помещается в статический массив.

мне кажется, что указатель возврата либо будет указывать на массив, который вы вводите с помощью аргумента md, либо, если аргумент md равен NULL, указатель возврата указывает на статический массив, приватный для функции. Нигде я не вижу упоминания о том, что вы должны явно освободить указатель, возвращаемый функцией.

0 голосов
/ 11 февраля 2012

unsigned char *SHA1(const unsigned char *d, unsigned long n, unsigned char *md);

Согласно документации, если md==0, возвращаемое значение равно md.Если md==0, он помещается в статический массив, так что вам не нужно об этом беспокоиться.Я написал следующую партию, чтобы доказать концепцию.

#include <openssl/sha.h>
#include <string.h>
#include <stdio.h>

void print_hash( const unsigned char* c )
{
    printf( "The hash is: " );

    int index;
    for(index = 0; index < SHA_DIGEST_LENGTH; index++)
        printf( "%X", *c++ );

    printf( "\n" );
}

int main(int argc, char* argv[])
{
    unsigned char hash[SHA_DIGEST_LENGTH];

    unsigned char str[100];
    scanf( "%s", str );

    unsigned char* sha = SHA1(str, strlen((char*)str), hash);

    print_hash( hash );
    print_hash( sha );
    print_hash( SHA1(str, strlen((char*)str), 0) );
}

Результаты:

some example input
The hash is: EB875812858D27B22CB2B75F992DFFADC1B05C66
The hash is: EB875812858D27B22CB2B75F992DFFADC1B05C66
The hash is: EB875812858D27B22CB2B75F992DFFADC1B05C66

Как хранится хеш, зависит от вас.

0 голосов
/ 11 февраля 2012

Вы должны использовать evp_ * функции , а не те функции более низкого уровня, на которые вы ссылались.Там есть функции для уничтожения и создания дайджестов.

0 голосов
/ 11 февраля 2012

Единственный общий и правильный ответ: ознакомьтесь с документацией.Каждая внешняя функция, которую вы используете, должна указывать вам в своей документации, какой ввод она ожидает и что возвращает.

Если она говорит, что возвращает указатель на память, выделенную с помощью malloc (или эквивалент), выдолжен free сделать это сам.

(На практике иногда вы, возможно, сможете запустить valgrind и основать обоснованное предположение на отчете, но это не "решение" в той степени, в какой оно является предположением..)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...