メモリリークでいっぱいの大規模なC++コードベースを維持するように依頼されました。調べてみると、リークにつながるバッファオーバーフローがたくさんあることがわかりました(どうしてこれが悪くなったのか、知りたくありません)。
最初にバッファオーバーフローを削除することにしました。バグハンティングを簡単にするために、バッファオーバーランをチェックするためにどのツールを使用できますか?
メモリリークでいっぱいの大規模なC++コードベースを維持するように依頼されました。調べてみると、リークにつながるバッファオーバーフローがたくさんあることがわかりました(どうしてこれが悪くなったのか、知りたくありません)。
最初にバッファオーバーフローを削除することにしました。バグハンティングを簡単にするために、バッファオーバーランをチェックするためにどのツールを使用できますか?
LinuxではValgrindを使用します。
バッファオーバーフローを回避する方法として、より新しいデータ構造を使用することを検討してください。std :: stringへの読み込みはオーバーフローせず、std::vectorsは配列よりもはるかに安全です。アプリケーションが何であるかはわかりません。速度が必要なためにrawバッファーが使用される可能性がありますが、元のプログラマーが慣れていたため、rawバッファーが使用されるのが一般的です。
上記のツールを使用してメモリリークを検索することは良い考えですが、すべての潜在的なリークを見つけることができない場合があります。標準の文字列とコンテナクラスを使用すると、気づかなかった問題を排除できます。
IBMのPurifyがこれを行い、その下でアプリを実行すると、すべてのエラー(他のエラーを含む)のレポートが表示されます。
メモリリークを解消するには、UMDHを使用します-アプリを実行し、メモリのスナップショットを取り、再度実行し、スナップショットを作成してから、差分ツールを使用して、最初の実行以降に行われた割り当てを確認します(アプリを一度実行する必要があり、できる限りスナップショットを撮ります)。
電気柵をチェックしてください、それはバッファオーバーフローのためだけの設計です!コード自体の速度は低下しません(ただし、割り当て/割り当て解除の速度は低下します)。それは動作し、LinuxとWindowsです。
これは、割り当てられた各スペースの前後に、読み取りまたは書き込みアクセスのないセグメントを追加することによって機能します。このメモリにアクセスしようとすると、UNIXではセグメンテーション違反が発生し、Windowsではメモリ違反(または同様の問題)が発生します。
/ GSの問題は、実際にはバグをスキャンしないことです。事後に警告します。既存のコードをスキャンして、実行中のバッファの過不足を検出するツールを探しているようです。
これやその他の欠陥に適したツールは、MicrosoftPreFASTツールです。
MS:
Windows のApplication Verifier (無料!)について誰も言及していないことに驚いています。Visual Leak Detector (別の回答で言及されています) は、多くの種類のメモリ リークを追跡するのに非常に優れていますが、Application Verifier は、バッファ オーバーラン、二重解放、解放後のバッファ使用 (およびさらに多くの) などのメモリ エラーを追跡するためのトップ ドッグです。
編集:そして、それは非常に使いやすいです。
私の投票はRationalPurifyに行きます。それに匹敵する価格で非常に強力です。多くの問題の短い仕事をして、本当にそれ自身のためにお金を払うことができます。また、ほとんどの*nixで利用できます。ただし、Windowsについてはよくわかりません。
Compuware の Devpartnerの BoundsChecker コンポーネントは、動的な実行という点でこれを非常にうまく行っています。静的テストの場合、pc-lint と flex-lintをRiverblade のビジュアル lintと組み合わせて、使いやすさとレポートを作成することをお勧めします。新しいコード ベースを受け取った場合は、厄介なものだけをキャッチできるように、適度に緩いルールで静的解析を開始することをお勧めします。コードベースが改善されるにつれて、ルール セットを強化できます。
Windows Mobile / Windows CE でこれを行う必要がある場合は、Entrek のコード スニッチを確認してください。
コードが実際に使用されるかどうかを検討するもう 1 つのツールはAQtrace です。これは基本的にユーザー マシンのクラッシュを分析し、詳細を送信します。(バウンドチェック、浄化、リンティング、valgrinding などのすべてが何かを見落としている場合に備えて)
Visual Studioには、バッファオーバーフロー保護を追加する/GSコンパイラフラグがあります。他にありますか?
Visual Leak Detectorを試すことができます-私はそれを自分で使用しました、そしてそれは私がmem-leakdetectionに最初にお勧めするものです。
Jochen Kalmbach による CodeProject の無料の「leakfinder」ツールをお勧めします。このメモリ リークの質問に関するこのスレッド (およびその他の回答) の詳細については、私の投稿を参照してください。
Windows では、メモリ リーク/バッファ オーバーランおよびその他の実行時エラー検出に使用できます。
クリーンアップが必要な大規模なプロジェクトがある場合、価格に見合う価値があると思います。