web-dev-qa-db-ja.com

デッドコードの識別(C ++)

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

静的分析によってこれを識別するツールを探しています。

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

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

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

52
Rob Walker

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

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

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

6
unwesen

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

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

私はGimpelとは関係がなく、満足している長期の顧客です。

8
Dan

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

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

別のアプローチは、コールグラフ生成ツール(doxygenなど)である可能性があります。

3
flolo

いくつかのアプローチを使用することをお勧めします。1。GCCにはいくつかの便利なコンパイルフラグがあります。

-Wunused-function
-Wunused-label
-Wunused-value
-Wunused-variable
-Wunused-parameter
-Wunused-but-set-parameter

2. Cppcheckには、次のような便利な機能がいくつかあります。

 --enable=unusedFunction

3.前に提案したように静的アナライザーを使用します。

1

Delphiを使用した場合に有効なアプローチの1つは、デバッグを有効にして、デバッガーでプログラムを実行することです。

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

コメント投稿者がこれを誤解しているように見えるため、いくつかの追加のメモ:

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

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

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

0
Roddy

どちらか
1)MSVCは組み込みで十分に活用されていません 静的分析ツール
2)MSVC marketplace には、 CppCheck を含む、ほとんどの無料ツールのサポートを含む多くのツールがあります。

マーケットプレイスアプリケーションには最新バージョンのVisualStudioが必要ですが、無料の " Community Edition "には非常に寛大なライセンスがあります。

0
Tiger4Hire