openssl / valgrind - PullRequest
       12

openssl / valgrind

9 голосов
/ 23 января 2009

У меня есть приложение, которое должно рассчитать MD5 файла, у меня есть использовал библиотеку openssl, valgrind все еще жалуется на некоторые блоки достижимы.

Скомпилируйте следующий код:

#include <openssl/bio.h>

int main(int, char**)
{
   BIO * mem = BIO_new(BIO_s_mem());
   BIO_vfree(mem);
   return 0;
}

запустить его с помощью valgrind вот что я получаю:

==23597== 220 bytes in 6 blocks are still reachable in loss record 1 of 1
==23597==    at 0x4022D78: malloc (vg_replace_malloc.c:207)
==23597==    by 0x432FD0D: (within /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23597==    by 0x433036E: CRYPTO_malloc (in /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23597==    by 0x43989C9: lh_new (in /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23597==    by 0x4332025: (within /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23597==    by 0x433249B: (within /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23597==    by 0x4332B5D: CRYPTO_new_ex_data (in /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23597==    by 0x438E053: BIO_set (in /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23597==    by 0x438E0E9: BIO_new (in /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23597==    by 0x80485E1: main (in /home/kalman/cxx_test/md5test/a.out)

кто-нибудь имел такой же опыт?

Ответы [ 4 ]

4 голосов
/ 23 октября 2013
BIO_new() -> BIO_set() -> CRYPTO_new_ex_data() -> int_new_ex_data() -> def_get_class()

int_new_ex_data () не освобождает память, в которой используется def_get_class.

СМ.: http://openssl.6102.n7.nabble.com/memory-leak-in-engine-cleanup-td30935.html http://rt.openssl.org/Ticket/Display.html?id=2673&user=guest&pass=guest

4 голосов
/ 06 февраля 2009

Я полагаю, что это некоторые статические структуры, которые openssl выделяет. Я запустил ваш код, и я выполнил следующий код, и valgrind сообщил, что у обоих было одинаковое количество неосвобожденной памяти:

#include <openssl/bio.h>

int main(int, char**)
{
   BIO * mem = BIO_new(BIO_s_mem());
   BIO * mem2 = BIO_new(BIO_s_mem());
   BIO * mem3 = BIO_new(BIO_s_mem());
   BIO * mem4 = BIO_new(BIO_s_mem());
   BIO_vfree(mem);
   BIO_vfree(mem2);
   BIO_vfree(mem3);
   BIO_vfree(mem4);
   return 0;
}

~

4 голосов
/ 23 января 2009

OpenSSL имеет действия, которые запутывают Valgrind, когда он не скомпилирован с -DPURIFY. Это ошибка, которую вы видите?

2 голосов
/ 11 октября 2012

OpenSSL содержит много неинициализированных переменных, переменных и памяти, которые никогда не освобождаются, переменные никогда не очищаются и недоступны вне области видимости, даже для освобождения вручную Вальгринд находит много таких.

Флаг PURIFY относится только к функции rand () _. Поэтому, чтобы избежать обнаружения в Purify, Openssl фактически использует другой исходный код, если этот флаг установлен. Хорошее кодирование ... Может быть, лучше решить проблему в первую очередь?!

...