web-dev-qa-db-ja.com

C ++コードの静的分析での誤検知とレガシーコードの警告の処理

no静的分析 が現在実行されている大きな「レガシー」C++コードベースがあります。

時々、少なくとも cppcheck を使用することを考えています。おそらく Visual Lint を使用します。 (Coverity、Klocwork、RedLizards/Goannaのサイトも簡単に確認しました。)

ただし、hugeの数の警告と、おそらく誤検知(エラー 実際には観察可能なバグを引き起こさない) アプリケーション内)。

特に、非常に「 (十分に機能する)」.

したがって、私が探しているのは、C++静的分析をレガシーコードベースに追加した経験とユーザーストーリーです。

この製品は、zzz C++プロジェクトのxxx行のコードで構成されており、静的分析ツールyyyの開発を開始しました。レガシーコードの警告を根絶するには、(一時的に)警告を無視するのは困難/簡単/不可能でした。コードベースの警告を選択的に無視することは、実際にはうまく機能しました/まったく機能しませんでした。等。

このようなもの。ありがとう!

5
Martin Ba

これらのツールごとに、表示する警告のクラスと抑制する警告のクラスを選択できます。

Klocworkの使用経験があり、実際のレポートと同様に、選択範囲の細かさはかなり良好です。つまり、「古い」エラーを除外して、変更されたコードのツール。とても便利で便利だと思います。

ただし、考慮すべき点:

ただし、私は膨大な数の警告と、おそらく誤検知も検出すると予想します(エラーが実際にアプリケーションに観察可能なバグを引き起こさないため)。

時々、エラーがアプリケーションに観察可能なバグを引き起こさない場合でもnowですが、将来あなたに噛みつくかもしれません。それが起こっているのを見て、それは苦痛でした。現在、目に見える損傷を引き起こさないという理由だけでエラーを無視することは、良い考えではありません。

もちろん、時間を優先して管理しますが、エラーを無視して忘れないでください。それらは、最も不適切な瞬間にエラーが存在することを思い出させる傾向があります。

6
littleadv

私はこれを数年前に経験しました(12歳のレガシーコードベースにlintを導入)。私は圧倒的なエラーの洪水に終わりましたが、私は最も一般的な(数百または数千のインスタンスで)問題を無視することに決め、少数の回数だけ発生するメッセージに集中しました。何百もの場所で見つかった問題はおそらく無害です(観察可能な問題はすべて修正された可能性がありますが、メッセージは単なるノイズである可能性が高いです)。

これにより、いくつかの衝撃的な配列境界の問題とループの問題が修正され、最も一般的な問題のメッセージを無効にしてしまいました。

Awkと私は、lintの出力を分析して、良い友達になりました。もう一度やるなら、今はPerlを使うだろう。

4
James McLeod

ここでは、静的分析ツールの費用対効果に関するいくつかの研究を紹介します。

http://collaboration.csc.ncsu.edu/laurie/Papers/TSE-0197-0705-2.pdf

調査の要点は、静的分析ツールは、確立されたコードベースでの検査と同じ程度のコスト/利益比であるということです。結局、バグを発見するためのコストは約1/2の検査でした(ただし、これは明らかにコードベースに大きく依存しています。なぜ彼らはコストが同じ桁であると結論付けたのでしょうか)。

3
Dale