2009-01-23 73 views
8

我有一個應用程序必須計算文件的MD5,我有 使用openssl庫,valgrind抱怨一些塊仍然 可達。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) 

人有同樣的經歷?

回答

3

當未使用-DPURIFY編譯時,OpenSSL的操作會混淆Valgrind。 Is this the error you are seeing?

+0

作爲當你不使用-DPURIFY發生什麼事的例子,看到http://www.metasploit.com/users/hdm/tools/debian-openssl/(我並不是說沒有運行valgrind就沒有直接導致錯誤,但它確實會導致人們採取最終導致錯誤的行動)。 :-P – 2009-01-23 14:11:48

3

我相信這些是openssl分配的一些靜態結構。我跑你的代碼,我跑了下面的代碼和Valgrind的報道,都有過unfreed存儲相同數量的:

#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含有大量的未初始化的變量,變量和記憶永遠不會被釋放的,變量永遠不會被清除,並且在範圍之外無法訪問,甚至無法手動釋放。 Valgrind發現了很多這些。

PURIFY標誌只與rand()_函數有關。所以爲了避免在Purify中進行檢測,Openssl實際上使用了不同的源代碼,如果該標誌被設置的話。很好的編碼...也許更好地解決問題的第一位?!