2009-01-23 33 views
8

Ich habe eine Anwendung, die MD5 der Datei berechnen muss, habe ich verwendet die OpenSSL-Bibliothek, Valgrind beschwert sich über einige Blöcke immer noch erreichbar.openssl/valgrind

Kompilieren Sie den folgenden Code ein:

#include <openssl/bio.h> 

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

den Lauf es valgrind mit dieser ist, was ich zu erhalten:

==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) 

jemand hatte gleiche Erfahrung?

Antwort

3

OpenSSL hat Aktionen, die Valgrind verwirren, wenn nicht mit -DPURIFY kompiliert wurde. Is this the error you are seeing?

+0

Als ein Beispiel dafür, was passiert, wenn Sie nicht -DPURIFY verwenden, finden Sie http://www.metasploit.com/users/hdm/tools/debian-openssl/ (I Ich sage nicht, dass das Ausführen von Valgrind ohne -DPURIFY direkt den Fehler verursacht hat, aber es hat dazu geführt, dass Leute Aktionen ausgeführt haben, die den Fehler verursacht haben. :-P –

3

Ich glaube, das sind einige statische Strukturen, die openssl zuweist. Ich lief den Code, und ich lief den folgenden Code und valgrind berichtet, dass beide die gleiche Menge an unfreed Gedächtnis hatte:

#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; 
} 

~

2

OpenSSL enthält eine Menge von nicht initialisierten Variablen, Variablen und Speicher nie freigegeben, Variablen werden nie gelöscht und sind außerhalb des Bereichs nicht erreichbar, um sogar manuell freigegeben zu werden. Valgrind findet viele davon.

Das PURIFY-Flag bezieht sich nur auf die Funktion rand() _. Um eine Erkennung in Purify zu vermeiden, verwendet Openssl tatsächlich einen anderen Quellcode, wenn dieses Flag gesetzt ist. Nette Programmierung ... Vielleicht besser, um das Problem an erster Stelle zu beheben ?!