一部の古いコードをリファクタリングしているときに、特定のヘッダー ファイルが、.cpp ファイルから長い間削除された関数の関数宣言でいっぱいであることに気付きました。これらを自動的に検出 (および削除) できるツールを知っている人はいますか?
7 に答える
You could if possible make a test.cpp file to call them all, the linker will flag the ones that have no code as unresolved, this way your test code only need compile and not worry about actually running.
PC-lintは、専用の目的で調整できます。
私はあなたの質問に対して次のコードをテストしました:
void foo(int );
int main()
{
return 0;
}
lint.bat test_unused.cpp
次の結果が得られました。
================================================== ========== ---モジュール:test_unused.cpp(C ++) ---モジュールのまとめ:test_unused.cpp 情報752:ローカル宣言子'foo(int)'(2行目、ファイルtest_unused.cpp)が参照されていません test_unused.cpp(2):情報830:前のメッセージで引用された場所 ================================================== ==========
したがって、あなたはあなたの目的のために警告番号752を渡すことができます:
lint.bat-"e *" + e752 test_unused.cpp
-e "*"はすべての警告を削除し、+e752はこの特定の警告をオンにします
さらに、Doxygen(@Milan Babuskov)を使用すると、コンパイラーでこれに関する警告があるかどうかを確認できます。たとえば、gccには静的関数用の-Wunused-functionがあります。-fdump-ipa-cgraph。
PC-Lintについて良いことを聞いたことがありますが、おそらくあなたのニーズにはやり過ぎだと思います。
Doxygen を使用してコードにインデックスを付けると、各関数がどこから参照されているかがわかります。ただし、各クラス (クラスごとに 1 つの HTML ページ) をブラウズして、何も指していないクラスをスキャンする必要があります。
または、ctags を使用してコード内のすべての関数のリストを生成し、objdump または同様のツールを使用して .o ファイル内のすべての関数のリストを取得し、それらのリストを比較することもできます。ただし、これは名前のマングリングが原因で問題になる可能性があります。
一致しない機能をチェックして報告できるvim 用のC++ ftplugin があります。ftplugin は ctags の結果に基づいています (したがって、そのヒューリスティックは他の環境に簡単に適応できます)。インライン関数の場合、誤検知が発生することがあります。
HTH、
実際のソースツリーに本体を持たない関数が外部ライブラリで定義されている可能性があるため、そのようなことはないと思います。これは、ヘッダーで宣言された関数のリストを作成し、それらが時々呼び出されるかどうかを検証するスクリプトを作成することによってのみ実行できます。