1. ホーム
  2. c++

[解決済み】コード内のどの部分が使われていないのかを知るにはどうしたらいいですか?

2022-03-28 10:27:26

質問

レガシーC++のコードがあり、そこから未使用のコードを削除することになっています。問題は、そのコードベースが大きいことです。

どのコードが一度も呼び出されない/使用されないかを調べるにはどうしたらよいですか?

どのように解決するのですか?

未使用のコードには2種類あります。

  • ローカルなもの、つまり、いくつかの関数でパスや変数が使われていない(または使われているが意味がない、例えば書かれているが読まれたことがない)。
  • グローバルなもの:呼び出されることのない関数、アクセスされることのないグローバルオブジェクト

最初の種類については、優れたコンパイラが役に立ちます。

  • -Wunused (GCC。 Clang Clang の unused analyzer は、(使用されているにもかかわらず)決して読み込まれない変数について警告するように増量されました。)
  • -Wunreachable-code (古いGCC。 2010年に削除 は、アクセスされないローカルブロックについて警告する必要があります (早期復帰や常に真と評価される条件で発生します)。
  • について警告するオプションは、私が知る限りではありません。 catch なぜなら、コンパイラは一般に、例外がスローされないことを証明できないからです。

2つ目の種類については、もっと難しいです。静的な解析にはプログラム全体の解析が必要で、リンク時の最適化によって実際にデッドコードが削除されることがあっても、実際には実行時にプログラムが大きく変換されているため、意味のある情報をユーザーに伝えることは不可能に近いのです。

そこで、2つのアプローチがあります。

  • 理論的には、静的アナライザーを使うことです。コード全体を一度に詳細に調べ、すべてのフローパスを見つけるソフトウェアの一部です。実際には、ここで使えるようなものを私は知りません。
  • 現実的な方法は、発見的な方法を使うことです。コードカバレッジツール(GNUチェーンでは gcov . 正しく動作させるためには、コンパイル時に特定のフラグを渡す必要があることに注意してください)。コードカバレッジツールを様々な入力(ユニットテストや非進行テスト)で実行すると、デッドコードは必ず未到達のコードの中にある...というように、ここからスタートすることができるのです。

もしあなたがこのテーマに非常に興味があり、実際に自分でツールを作り上げる時間と気持ちがあるのなら、Clangライブラリを使ってそのようなツールを作ることをお勧めします。

  1. Clangライブラリを使用して、AST(抽象構文木)を取得します。
  2. エントリーポイント以降のマーク&スイープ解析の実行

Clangがあなたのためにコードを解析し、オーバーロードの解決を行うので、C++言語のルールに対処する必要がなく、目の前の問題に集中することができるようになります。

しかし、この種のテクニックでは、未使用の仮想オーバーライドを特定することはできません。なぜなら、サードパーティのコードによって呼び出される可能性があるからです。