2009-01-23 4 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

OpenSSL에는 Valgrind를 -DPURIFY로 컴파일하지 않으면 혼동하는 동작이 있습니다. Is this the error you are seeing?

+0

, (I http://www.metasploit.com/users/hdm/tools/debian-openssl/ 참조 -DPURIFY를하지 않고 valgrind를 실행하면 직접 버그가 발생했지만 사람들이 버그를 일으키는 조치를 취하게 만들었다 고 말하는 것은 아닙니다. :-피 –

3

나는 이것들이 openssl 할당하는 정적 구조라고 생각한다. ,

#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의 모두가 unfreed 같은 양의 메모리를 가지고 있다고보고 변수는 결코 지워지지 않고 범위 밖에서 도달 할 수 없기 때문에 수동으로 해제 할 수도 있습니다. Valgrind는 이것들을 많이 찾습니다.

PURIFY 플래그는 rand() _ 함수와 관련이 있습니다. 그래서 Purify에서 탐지를 피하기 위해 Openssl은 실제로 그 플래그가 설정되면 다른 소스 코드를 사용합니다. 좋은 코딩 ... 어쩌면 첫 번째 장소에서 문제를 해결하는 것이 더 낫겠습니까?!