Valgrindが1つのシステムで無効な読み取りを報告しますが、別のシステムでは無効です [c++]


Answers

あなたが与えた疎な情報から判断すると、異なるライブラリバージョンが最良の推測です。 試してみるもの:

1)両方のマシンをパッケージマネージャーから最新の状態にして、もう一度お試しください

2)問題のプログラムで使用されているすべてのライブラリをldd [binary]を実行します。 両方のマシンでmd5sumようなものを実行して、違いがあるかどうかを調べます。

私はvalgrindが本当にスタック上の無効なメモリアクセスを検出するのが悪いという経験をしました。これは隠された根本的な原因かもしれません。 それ以外の場合は、clangとaddress sanitizerを試してみてください。 それはvalgrindがキャッチしないもの、およびその逆を見つけるかもしれません。

Question

私は仕事のために新しいマシンでかなり大きなソフトウェアパッケージを実行する必要があります。 アプリケーションはCとC ++で書かれており、CentOS 6.5で動作しています。

プログラムはうまく構築されますが、実行するとsegfaultsが発生します。 valgrindを使用すると、segfaultの場所で次のエラーが報告されています。

==23843== Invalid read of size 4
[stack trace here]
==23843==  Address 0x642e7464 is not stack'd, malloc'd or (recently) free'd

だから何らかの理由で、私たちが想定していないメモリから読み込み、未定義の動作を呼び出しています。 私のソースファイルをtarアップして、別のCentOS 6.5マシン(同じカーネルを持っている)に持っていき、同じmakefileと同じGCCバージョンでコンパイルすると、プログラムはうまく動いているようです。

私はそのマシンでもvalgrindを実行して、無効な読込みを再度見ることが予想されます。 私の考えは、無効な読み取りが常に存在するということでしたが、その動作は未定義であるため、ちょうど1台のマシンで正しく動作するようになりました。

しかし、私が見つけたのは、valgrindが2番目のマシンで読み取りエラーを報告しないということでした。 どのようにこれを可能にすることができますか?