または、できれば私のコードだけでなく、それらすべてを使用しますか?私のプログラムはGtk、ラウドマスなどを使用しており、これら2つ(およびその背後のいくつか、libgcrypto、libssl)自体が非常に多くのエラーを引き起こしているため、自分のエラーを検出できません。私自身のコードよりも深いところから来るものをvalgrindに無視させることは可能ですか?
ライブラリのエラーを抑制できますが、一般的にはライブラリを除外できないと思います。
また、ライブラリのメモリエラーの原因がコードの問題かどうかを自動的に判断するのは困難です。
memcheckツールを実行していて、Leakエラーを無視したい場合libcryptoのみでは、次のような抑制を行うことができます。
{
ignore_libcrypto_conditional_jump_errors
Memcheck:Leak
...
obj:*/libcrypto.so.*
}
...ファイルに入れて、valgrind
に--suppressions=*FILENAME*
を付けて渡します。
無視するリークすべての共有ライブラリのエラーlibディレクトリ(/ lib、/ lib64、/ usr/lib、/ usr/lib64、...):
{
ignore_unversioned_libs
Memcheck:Leak
...
obj:*/lib*/lib*.so
}
{
ignore_versioned_libs
Memcheck:Leak
...
obj:*/lib*/lib*.so.*
}
可能性は低いですが、X11およびGTKライブラリの場所を考慮して、ディレクトリパターンのバリエーションを追加する必要がある場合があります。
これにより、ライブラリによって呼び出された、ユーザーが記述したコールバックによって発生したエラーは無視されます。これらのコールバックでエラーをキャッチすることは、ほとんどで行うことができます:
{
ignore_unversioned_libs
Memcheck:Leak
obj:*/lib*/lib*.so
...
obj:*/lib*/lib*.so
}
{
ignore_versioned_libs
Memcheck:Leak
obj:*/lib*/lib*.so.*
...
obj:*/lib*/lib*.so.*
}
...しかし、これにより、Valgrind mallocを使用するライブラリによる呼び出しのエラーが明らかになります。 valgrind mallocはプログラムテキストに直接挿入されるため(動的ライブラリとして読み込まれません)、独自のコードと同じようにスタックに表示されます。これにより、Valgrindが割り当てを追跡できるようになりますが、ユーザーが要求した内容を正確に実行することも難しくなります。
参考:valgrind 3.5を使用しています。
特にOpenSSLでは、これは非常に困難です。 SSL暗号化キーの一部は、初期化されていないスタックガベージに基づいています。つまり、復号化されたすべてのデータも汚染されます。この汚染はOpenSSL自体を超えて広がる傾向があります。
「PURIFY」オプションを使用してOpenSSLをコンパイルすると、ここで役立つ場合があります。残念ながら、主要なLinuxディストリビューションによるいくつかのよく考えられていないアクションのため、これがデフォルトになる可能性は低いです。
非常に率直な回避策は、memcheckの--undef-value-errors=no
オプション。