[解決済み】コード内のどの部分が使われていないのかを知るにはどうしたらいいですか?
2022-03-28 10:27:26
質問
レガシーC++のコードがあり、そこから未使用のコードを削除することになっています。問題は、そのコードベースが大きいことです。
どのコードが一度も呼び出されない/使用されないかを調べるにはどうしたらよいですか?
どのように解決するのですか?
未使用のコードには2種類あります。
- ローカルなもの、つまり、いくつかの関数でパスや変数が使われていない(または使われているが意味がない、例えば書かれているが読まれたことがない)。
- グローバルなもの:呼び出されることのない関数、アクセスされることのないグローバルオブジェクト
最初の種類については、優れたコンパイラが役に立ちます。
-
-Wunused
(GCC。 Clang Clang の unused analyzer は、(使用されているにもかかわらず)決して読み込まれない変数について警告するように増量されました。) -
-Wunreachable-code
(古いGCC。 2010年に削除 は、アクセスされないローカルブロックについて警告する必要があります (早期復帰や常に真と評価される条件で発生します)。 -
について警告するオプションは、私が知る限りではありません。
catch
なぜなら、コンパイラは一般に、例外がスローされないことを証明できないからです。
2つ目の種類については、もっと難しいです。静的な解析にはプログラム全体の解析が必要で、リンク時の最適化によって実際にデッドコードが削除されることがあっても、実際には実行時にプログラムが大きく変換されているため、意味のある情報をユーザーに伝えることは不可能に近いのです。
そこで、2つのアプローチがあります。
- 理論的には、静的アナライザーを使うことです。コード全体を一度に詳細に調べ、すべてのフローパスを見つけるソフトウェアの一部です。実際には、ここで使えるようなものを私は知りません。
-
現実的な方法は、発見的な方法を使うことです。コードカバレッジツール(GNUチェーンでは
gcov
. 正しく動作させるためには、コンパイル時に特定のフラグを渡す必要があることに注意してください)。コードカバレッジツールを様々な入力(ユニットテストや非進行テスト)で実行すると、デッドコードは必ず未到達のコードの中にある...というように、ここからスタートすることができるのです。
もしあなたがこのテーマに非常に興味があり、実際に自分でツールを作り上げる時間と気持ちがあるのなら、Clangライブラリを使ってそのようなツールを作ることをお勧めします。
- Clangライブラリを使用して、AST(抽象構文木)を取得します。
- エントリーポイント以降のマーク&スイープ解析の実行
Clangがあなたのためにコードを解析し、オーバーロードの解決を行うので、C++言語のルールに対処する必要がなく、目の前の問題に集中することができるようになります。
しかし、この種のテクニックでは、未使用の仮想オーバーライドを特定することはできません。なぜなら、サードパーティのコードによって呼び出される可能性があるからです。
関連
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] Linux上で動作するC++コードのプロファイリングを行うにはどうすればよいですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] 整数の平方根が整数であるかどうかを判断する最速の方法
-
[解決済み] C++で仮想関数が必要な理由とは?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)