web-dev-qa-db-ja.com

大規模なC ++レガシーアプリケーションで「デッドコード」を見つける

私は現在、私の前に多くの開発者がいる大規模で古いC++アプリケーションに取り組んでいます。プロジェクトには多くの「デッドコード」があり、クラスや関数はもはや誰も使用していません。

死んだコードを検出してリファクタリングするために大規模なコードベースの分析を行うためにC++で利用できるツールは何ですか?注:私はgcovのようなテストカバレッジツールについて話しているのではありません。

あなたのプロジェクトでどのようにして死んだコードを見つけますか?

56
gudnithor

静的分析ツールを使用する必要があります

私が遭遇した主な落とし穴は、あなたが制御/所有していない場所からライブラリが使用されないように注意しなければならないということです。プロジェクトのライブラリを参照して使用されるクラスから関数を削除すると、コードを使用して知らなかったものを壊す可能性があります。

27
Alan Jackson

この目的で Cppcheck を使用できます。

$ cppcheck --enable=unusedFunction .
Checking 2380153.c...
1/2 files checked 0% done
Checking main.c...
2/2 files checked 0% done
[2380153.c:1]: (style) The function '2380153' is never used.
10
user6307369

CaolánMcNamaraの callcatcher は、LibreOfficeプロジェクト(〜6 MLOC)内でデッドコードを見つけるために非常に効果的に使用されています。

3
phw

コードに精通していることに勝るものはありません。人が進むにつれておそらく多分厳しい剪定を除いて。

時々、デッドウッドのように見えるものがユニットテストなどの足場として使用されたり、レガシーユニットテストがそれを実行しただけで生きているように見えても、テスト以外では実行されなかったりします。少し前に、外部のCADモデルトランスレータをサポートしていた1000を超えるLOCを削除しました。これらの外部トランスレータを呼び出すテストがありましたが、これらのトランスレータは8年以上サポートされておらず、その方法はありませんでした。アプリケーションのユーザーは、呼び出したくても呼び出すことができます。

枯れた木を取り除くのに厳格でない限り、何年もの間あなたのチームがものを維持していることに気づくでしょう。

3
lilburne

私はあなたの最善の策はおそらく報道ツールであろうと思います。 * nixとwindowsの両方に十分な数があります。単体テストがある場合、それは簡単です。テストカバレッジが低い場合、カバーされていないコードは動作していないか、まだテストされていません(とにかくこの両方の情報が必要です)。単体テストがない場合は、これらのツールのいずれかによって提供されるインストルメンテーションを使用してアプリをビルドし、いくつかの(すべてが理想的ですが)実行パスを介して実行し、レポートを確認します。単体テストと同じ情報が得られます。さらに多くの作業が必要になります。

VisualStudioを使用しているので、使用を検討できるリンクをいくつか提供します。

どちらも無料ではなく、安くさえありませんが、結果は通常それだけの価値があります。

* nixのようなプラットフォームでは、 gcovzcov または lcov のようなツールと組み合わせることは本当に素晴らしい選択です。

3
Dmitry

1つの方法は、クラス名と関数名で「すべての参照を検索」コンテキストメニュー項目を使用することです。クラス/関数がそれ自体でのみ参照されている場合、ほぼ確実にデッドコードです。

同じアイデアに基づく別のアプローチは、プロジェクトからファイル/関数を削除(コメントアウト)して、どのエラーメッセージが表示されるかを確認することです。

1
hongliang

SD C++テストカバレッジ を参照してください。

カバレッジの最大量に到達することを確認するには、コードを実行するために多くの動的テストを行う必要があります。 「カバーされない」コードは、死んでいる場合と死んでいない場合があります。おそらく、それを実行するためのテストケースがなかっただけかもしれません。

0
Ira Baxter