54

Visual Studio 2008 でコンパイルされた大規模なレガシー C++ プロジェクトがあります。どこにもアクセスされない、かなりの量の「デッド」コード (呼び出されないメソッド、使用されないクラス全体) があることを知っています。

これを静的解析で特定するツールを探しています。

この質問:レガシ C/C++ プロジェクトでのデッド コード検出では、コード カバレッジ ツールの使用が提案されています。テストカバレッジが十分に高くないため、これはオプションではありません。

また、-Wunreachable-code についても言及しています。gcc のオプション。Visual Studio にも同様のものが欲しいです。既にリンカの /OPT:REF オプションを使用して冗長コードを削除していますが、これは有用なレベルでデッド コードを報告しません (/VERBOSE と一緒に使用すると、ライブラリからの多くを含めて 100,000 行を超えます)。

Visual Studio プロジェクトでうまく機能するより良いオプションはありますか?

4

7 に答える 7

9

Gimpel の Lint 製品 ( PC-LintおよびFlexelint ) は、到達不能なコードと未使用/参照されていないモジュールを識別します。

どちらも静的分析ツールのカテゴリに分類されます。

私は Gimpel とは何の関係もありません。満足している長期的な顧客です。

于 2009-06-30T20:15:43.327 に答える
7

QA-C++ ( http://www.programmingresearch.com/QACPP_MAIN.html ) のラインに沿ったものが必要になります。同様の製品についてはhttp://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysisも参照してください。

到達不能コードを検出する静的コード分析ツールを探しています。多くのコーディング ガイドライン (私の間違いでなければ、MISRA-C++ など) では、到達不能なコードが存在しないことを要求しています。このようなガイドラインを実施するために特別に調整された分析ツールが最善の策です。

また、このツールの他の用途も見つけることができます。

于 2008-11-26T16:37:53.690 に答える
3

私は Visual C を知らず、-Wunreachable-code 固有のカバレッジ ツールも推奨していました。あなたの状況の解決策として、私は次のことを試します:

  1. ctags (または同様のプログラム) を使用して、ソース内のすべてのシンボルのリストを作成します
  2. コンパイラでデッド コードの削除を有効にします (デフォルトでオンになっていると思います)。
  3. プログラム全体/リンク時間の最適化を有効にします (そのため、モジュールで使用されていない関数は他の外部から必要とされず、破棄されることを彼は知っています)
  4. バイナリからシンボルを取得し、1 のシンボルと比較します。

別のアプローチとして、コール グラフ生成ツール (doxygen など) を使用することもできます。

于 2008-11-26T16:43:12.460 に答える
0

私にとって (Delphi で) 有効なアプローチの 1 つは、デバッグを有効にして、デバッガーでプログラムを実行することです。

デバッガで Delphi プログラムを実行すると、IDE の余白にブレークポイントとして設定できるコード行が表示されます。本当に死んでいるコード、つまりリンカ/コンパイラによって取り除かれたコードは、そこにブレークポイントを設定できないため明らかです。

コメンターがこれを誤解しているように見えるので、いくつかの追加の注意事項:

a: 各行にブレークポイントを設定する必要はありません。IDE でソース ファイルを開き、すばやくスクロールするだけです。デッドコードは簡単に見つけられます。

b: これは「コード カバレッジ」チェックではありません。行に到達したかどうかを確認するためにアプリケーションを実行する必要はありません。

c: 私は VS2008 に精通していないので、この提案が機能するかどうかはわかりません。

于 2008-11-26T18:05:06.167 に答える