バックグラウンド
私はネイティブ C++ で数年間にわたって作成したアプリケーションを持っていますが、これは約 60 KLOC です。死んでいる関数やクラスはたくさんあります (以下の同様の Unix ベースの質問のように、おそらく 10 ~ 15% です)。私たちは最近、すべての新しいコードに対して単体テストを行い、可能な限り変更されたコードに適用することを開始しました。ただし、現時点でテスト カバレッジが 5% 未満である SWAG を作成します。
仮定/制約
メソッドおよび/またはツールは、以下をサポートする必要があります。
- ネイティブ (つまり、アンマネージ) C++
- WindowsXP
- ビジュアル スタジオ 2005
- カバレッジのためにユーザー提供のテスト ケースを要求してはなりません。(たとえば、コード カバレッジを生成するために単体テストに依存することはできません)
メソッドがこれらの要件を超えるものをサポートしている場合は、すばらしいことです。
注:現在、Team System ではなく、Visual Studio 2005 の Professional エディションを使用しています。したがって、Team System を使用することは有効な提案かもしれません (わからない、使用したことがありません) が、それが唯一の解決策ではないことを願っています。
コード カバレッジに単体テストを使用することが問題となる理由
私は、汎用ツールが任意のアプリケーションですべてのデッド (到達不能コードなど) を誤検出ゼロで見つけることは不可能だと考えています (これは停止問題と同等だと思います)。しかし、一般的なツールが、実際には死んでいる可能性が非常に高い多くの種類のデッドコードを見つけることも可能だと私は信じています。たとえば、クラスや関数がコード内で他から参照されることは決してありません。
単体テストを使用してこのカバレッジを提供することにより、一般的なアルゴリズムを使用しなくなり、検出できるデッド コードの割合と、ヒットが誤検知ではない確率の両方が増加します。逆に、単体テストを使用すると、単体テスト自体が特定のコード部分を実行する唯一のものである可能性があるため、偽陰性になる可能性があります。理想的には、外部で利用可能なすべてのメソッド、API、ユーザー コントロールなどを実行する回帰テストを行います。これは、コード カバレッジ分析のベースライン測定として機能し、特定のメソッドが誤検知になることを除外します。残念ながら、現時点ではこの自動テストは行っていません。
ただし、テスト ケースのカバー率が非常に低い非常に大きなコード ベースがあるため、テスト ケースの作成に膨大な時間を費やすことなく役立つものを探しています。
質問
Visual Studio 2005 開発環境を使用した Windows プラットフォーム上のネイティブ C++ アプリケーションで、自動化または半自動化された方法でデッド コードを検出するにはどうすればよいでしょうか?
関連項目
レガシ C/C++ プロジェクトでのデッド コードの検出 VC++ コンパイラにすべてのコードをコンパイルするように指示します。それはできますか?