9

我有一个必须计算文件 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 回答 4

4

OpenSSL 在未使用 -DPURIFY 编译时具有混淆 Valgrind 的操作。 这是您看到的错误吗?

于 2009-01-23T13:21:52.977 回答
4

我相信这些是 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;
}

~

于 2009-02-06T05:49:15.940 回答
4
BIO_new() -> BIO_set() -> CRYPTO_new_ex_data() -> int_new_ex_data() -> def_get_class()

int_new_ex_data() 不会释放 def_get_class malloced 的内存。

参见: 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 =客人

于 2013-10-23T08:14:43.033 回答
2

OpenSSL 包含许多未初始化的变量、从未释放的变量和内存、从未清除的变量以及无法在范围外访问甚至无法手动释放的变量。Valgrind 发现了很多这样的东西。

PURIFY 标志仅与 rand()_function 有关。因此,为了避免在 Purify Openssl 中检测到,如果设置了该标志,则实际上使用不同的源代码。不错的编码...也许最好首先解决问题?!

于 2012-10-11T11:01:39.087 回答