web-dev-qa-db-ja.com

glibcがスモールビンリンクリストの破損を検出

大きなループで関数を繰り返し実行しようとしていますが、2〜3回の反復後にエラーが発生しますが、エラーが発生したポイントから開始すると、正常に機能しますが、3〜4回の反復後に再び停止します。メモリに問題がある可能性があります。関数が非常に大きいので、メモリリークが正確にどこにあるのかわかりません。とにかく、各反復後に変数を解放できますか、この問題を解決できるものはありますか?またはそれはリンクリストのメモリの問題なので、すべてのリンクリストまたは何かを解放しますか?解決策は何ですか?関数を1回実行しても問題は発生しないので、ループで関数を繰り返し呼び出しているためと考えられます。この問題を解決する方法はありますか?

エラーは

**glibc detected:.....malloc():smallbin double linked list corrupted: 0x000000000 1d404c0 ***
12
user1583647

ライブラリは、メモリメタデータが破損していることを通知しています。これは単なるメモリリークでは発生せず、無効なポインタに書き込む必要がありました。範囲外のインデックスへの書き込みか、解放された後のポインターへの書き込みのいずれかです。

この種の問題をデバッグする最も簡単な方法は valgrind を使用することです。これはLinuxでのみ機能しますが、すでに使用しているようです。プログラムをシングルステップで実行し、すべてのメモリアクセス命令をチェックするため、処理速度はやや遅くなりますが、無効なメモリアクセスや、初期化されていない変数やメモリリークの使用を非常に確実にキャッチできます。

duma(意図しないメモリアクセスを検出する) ライブラリもあります。他のプラットフォームでも動作するように作成でき、少し高速ですが、使用するメモリがはるかに多くなります。

そして、特定のコンパイラオプションによってアクティブ化できるgcc独自の mudflap があります。それはほとんどのgccターゲットで動作するはずですが、C++サポートがどれほど完全かはわかりません。

更新(2018年11月):mudflapは、主​​に Google Sanitizers によって置き換えられます。これらは Clang の一部です。

24
Jan Hudec

警告:非常に具体的な使用例

Qtで作成されたアプリケーションで、コピーコンストラクターを持つQObjectから派生したオブジェクトへのポインターを使用していたときに、この問題が発生しました。コンパイル中に次の警告を見落としました。

warning: base class ‘class QObject’ should be explicitly initialized in the copy constructor [-Wextra]

QObject派生オブジェクト コピーされないはずです であることがわかりましたが、QObject派生クラスのコピーコンストラクターがこの種の原因になるとは思っていませんでしたエラーの。

0
Ayberk Özgür