WindowsのネイティブC ++アプリケーションでの自動デッドコード検出?
-
08-07-2019 - |
質問
背景
私は数年かけてネイティブC ++で記述されたアプリケーションを所有しています。これは約60 KLOCです。死んでいる多くの関数とクラスがあります(おそらく、以下の同様のUnixベースの質問のように10-15%)。最近、すべての新しいコードの単体テストを開始し、可能な場合はいつでも変更されたコードに適用しました。ただし、現時点ではテスト範囲が5%未満のSWAGを作成します。
仮定/制約
メソッドおよび/またはツールは以下をサポートする必要があります:
- ネイティブ(管理されていない)C ++
- Windows XP
- Visual Studio 2005
- カバレッジのためにユーザー提供のテストケースを必要としない(例:コードカバレッジを生成するために単体テストに依存することはできません)
メソッドがこれらの要件以上をサポートしている場合、素晴らしい。
注:現在、チームシステムではなく、Visual Studio 2005のProfessionalエディションを使用しています。したがって、Team Systemを使用することは有効な提案かもしれません(私は知りません、私はそれを使用したことがありません)が、それが only ソリューションではないことを望んでいます。
コードカバレッジに単体テストを使用するのに問題がある理由
一般的なツールでは、誤検知がゼロの任意のアプリケーションですべてのデッド(到達不能コードなど)を見つけることは不可能だと思います(これは停止問題と同等だと思います)。ただし、一般的なツールでは、他の人がコード内で参照することのないクラスや関数など、実際にデッドになる可能性が高い多くのタイプのデッドコードを見つけることも可能です。
単体テストを使用してこのカバレッジを提供することで、汎用アルゴリズムを使用しなくなったため、検出できるデッドコードの割合と、ヒットが偽陽性ではない確率の両方が増加しています。逆に、ユニットテストを使用すると、ユニットテスト自体が特定のコードを実行する唯一のものになる可能性があるため、偽陰性になる可能性があります。理想的には、外部で利用可能なすべてのメソッド、API、ユーザーコントロールなどを実行する回帰テストを行い、特定のメソッドを誤検出から除外するためのコードカバレッジ分析のベースライン測定として使用します。残念ながら、現時点ではこの自動テストがありません。
テストケースのカバレッジ率が非常に低い大規模なコードベースがあるので、テストケースの作成に多大な時間を費やすことなく役立つものを探しています。
質問
Visual Studio 2005開発環境を備えたWindowsプラットフォームのネイティブC ++アプリケーションで、デッドコードを自動または半自動で検出するにはどうすればよいですか
参照
レガシーC / C ++プロジェクトでのデッドコード検出 伝えたいすべてのコードをコンパイルするVC ++コンパイラ。できますか?
解決
参照されていないオブジェクト(/ OPT:REF)を削除するようリンカーに依頼します。関数レベルのリンクと詳細なリンカー出力を使用する場合、リンカー出力には未使用であることが証明できるすべての関数がリストされます。このリストは完全にはほど遠いかもしれませんが、すでに必要なツールを持っています。
他のヒント
ブルズアイを使用していますが、お勧めできます。ユニットテスト環境から実行する必要はありませんが、それが私たちの仕事です。
単体テストスイートに対してコードカバレッジツールを使用します。