デッドコード識別(C ++)
-
11-07-2019 - |
質問
Visual Studio 2008でコンパイルされた大規模なレガシーC ++プロジェクトがあります。どこからもアクセスされない「呼び出されない」メソッド、使用されないクラス全体の「デッド」コードがかなりあります。
静的分析によってこれを識別するツールを探しています。
この質問:レガシーC / C ++プロジェクトでのデッドコード検出コードカバレッジツールの使用を提案します。テストカバレッジが十分に高くないため、これはオプションではありません。
-Wunreachable-codeにも言及しています。 gccのオプション。 Visual Studioでも似たようなものが欲しいです。すでに冗長コードを削除するためにリンカの/ OPT:REFオプションを使用していますが、これは有用なレベルでデッドコードを報告しません(/ VERBOSEと共に使用すると、ライブラリからの多くを含む100,000行を超えます)。
Visual Studioプロジェクトでうまく機能するより良いオプションはありますか?
解決
QA-C ++( http://www.programmingresearchに沿って何かが必要になります。 com / QACPP_MAIN.html )、 http://en.wikipedia.org/wikiも参照してください/ List_of_tools_for_static_code_analysis 同様の製品の場合。
到達不能コードを検出する静的コード分析ツールを探しています。多くのコーディングガイドライン(MISRA-C ++など、私が間違っていなければ)には、到達不能コードが存在しないことが必要です。このようなガイドラインを実施するために特別に設計された分析ツールが最善の策です。
そして、このツールの他の用途も見つけることができます。
他のヒント
Visual Cを知らないので、-Wunreachable-code固有のカバレッジツールも推奨していました。あなたの状況の解決策として、私は次のことを試みます:
- ctags(または同様のプログラム)を使用して、ソース内のすべてのシンボルのリストを作成します
- コンパイラでデッドコードの除去を有効にします(デフォルトではオンになっていると仮定します)
- プログラム全体/リンク時間の最適化を有効にします(したがって、モジュラーで使用されていない関数は他の外部からは不要であり、破棄されることを彼は知っています)
- バイナリからシンボルを取得し、それらを1のシンボルと比較します。
別のアプローチとして、コールグラフ生成ツール(doxygenなど)があります。
いくつかのアプローチを使用することをお勧めします。 1. GCCには、いくつかの便利なコンパイルフラグがあります。
-Wunused-function
-Wunused-label
-Wunused-value
-Wunused-variable
-Wunused-parameter
-Wunused-but-set-parameter
2。 Cppcheckには、次のような便利な機能があります。
--enable=unusedFunction
3。以前に提案されたように静的アナライザーを使用します。
私にとって有効な方法の1つは、Delphiを使用して、デバッグを有効にし、デバッガーでプログラムを実行することです。
デバッガーでDelphiプログラムを実行すると、IDEはマージンに、ブレークポイントとして設定できるコード行を表示します。本当に死んでいるコード-つまり、リンカ/コンパイラによって削除されたコードは、ブレークポイントをそこに設定できないため明らかです。
コメンターがこれを誤解しているように見えるため、いくつかの追加のメモ:
a:各行にブレークポイントを設定する必要はありません。 IDEでソースファイルを開き、すばやくスクロールします。デッドコードは簡単に発見されます。
b:これは「コードカバレッジ」チェックではありません。行に到達するかどうかを確認するためにアプリケーションを実行する必要はありません。
c:私はVS2008にあまり馴染みがないので、この提案が機能するかどうかは言えません。
いずれか
1)ビルドされた静的分析ツールでMSVCが十分に使用されていません。
2)MSVC marketplace には、 CppCheck
マーケットプレイスアプリケーションには最新バージョンのVisual Studioが必要ですが、無料の" コミュニティエディション"ライセンスが非常に緩やかです。
関数を(ソースコードから)ランダムに削除し、すべてをゼロから再コンパイルするスクリプトを作成します。それでもコンパイルされる場合-その関数はデッドコードでした。