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 に答える
2

OpenSSL には初期化されていない変数が多数含まれており、変数とメモリは解放されず、変数はクリアされず、手動で解放するためにスコープ外に到達することもできません。Valgrind はこれらをたくさん見つけます。

PURIFY フラグは、rand()_function にのみ関連しています。したがって、Purify Openssl での検出を回避するために、そのフラグが設定されている場合、実際には別のソース コードを使用します。素敵なコーディング...最初から問題を解決したほうがいいでしょうか?!

于 2012-10-11T11:01:39.087 に答える