呼び出されていない関数を見つけるにはどうすればよいですか?[閉まっている]


8

定義されているが使用されていない関数があるように見えるいくつかのC / C ++コードを見ています。これは、コードをトレースして確認するのにかなり退屈なプロセスです。私はいくつかの調査を行ったが、このタイプの分析を行うことができるツールはたくさんある。

このコードが実際に使用されていないことを確認するための最良のツールまたは代替の方法に関する経験やヒントを誰かと共有できますか?


回答:


10

プログラムに「デッドコード」を見つけることができるツールがいくつかあります。Stack Overflowスレッドについては、ここここでそれらについて読むことができます。短い要約:

gccコンパイラフラグ-Wunusedおよび-Wunreachable-codeを使用してから、lcovなどのツールを使用して未使用のメソッドを見つけます。


3
コンパイラーにこの機能がどのように存在するかはわかりませんが、リフレクションまたはRTTIのいずれかのタイプに基づく呼び出しを使用している場合、コードベースのどこでも静的に参照されていない名前でメソッドを呼び出すことができることに注意してください。
メイソンウィーラー、

5

痕跡?どうして?コメントアウトして、コンパイラーを実行します。他の場所で参照されている関数をコメントアウトした場合、すぐにわかります。


3
これはコンパイルされた言語でのみ機能し、PHPのような解釈された言語では機能しないことに注意してください。また、すべてのメソッドを実際にコメント/コメント解除してチェックするのに数日かかる可能性があるため、大規模なプロジェクトには実用的ではありません。
DavorŽdralo2012

1
彼はC ++であることを明確に示しています。インクリメンタルな再構築は非常に高速です。1つのソースファイル内の1つのメソッドにコメントを付けるだけであれば、リンカは非常にわかりやすいと言えます。
DeadMG

Cではこれはほとんど機能するはずです。ただし、DEFINEを使用して異なる実装間を切り替えるコードのような複雑な問題があります。C ++では、関数のオーバーロード、テンプレートの特殊化、およびおそらく他のいくつかの機能のため、確実に機能しません。
CodesInChaos

2

未使用のコードを積極的に探している場合は、Jake223が提案するものを使用してください

ただし、使用されていないように見えるコードに遭遇した場合は、コードベースでメソッドの名前を検索するだけで済みます。プライベートメソッドの場合、仕事は簡単です。現在のクラスのみを検索します。パブリックメソッドの場合は、すべてを検索します。クラス全体の場合は、すべてのコードでその名前を検索します。

当たりませんか?完璧です。コードを削除してテスト実行します。あなたにはテストがありますね?変更をドキュメントバージョンシステムにコミットするよりも。使ってみませんか?そうすれば、それが必要だと気づいた場合、変更を元に戻すことができます。

コードを削除することは、あなたが毎日やるべきことです。多分あなたはいくつかのコードをリファクタリングし、古いものを削除します。または、古い未使用のコードを見つけて削除します。バックアップがなくても、関数を1つまたは2つ書き換えるのはどれほど難しいですか。そして二回目は確かに以前よりも上手に書くでしょう。


+1は、手動で関数名を検索する古くて古くて退屈なプロセスを提案します。それほど楽しくはありませんが、うまくいきます!

1
また、それほど退屈でもありません。最新のIDEでは、テキストを非常にスマートに検索できます。さらに、C、C ++、Java、さらにはPHPについても、関数を右クリックして[使用状況を検索]をクリックするだけです。
Patkos Csaba

0

あなたがトラブルを探していない限り(つまり、あなたは彼らが呼ばれるべきだと知っている)なぜわざわざ。それらが本当に呼び出されていない場合、それらはおそらくリンカによって削除され、どのような場合でも無駄なスペースは重要ではありません。一方、それらを削除して後で必要になった場合(おそらく一部のコンパイラー構成では気付かなかった)、それらをリカバリーするために行う作業が増えます。これは、除去と再検出が長時間離れている場合は特に困難です。


4
その理由は、それらが呼び出されない場合、維持すべきでないコードを維持しているため、貴重なエンジニアリング時間を浪費しているからです。
マイケルコーン

何かに取り組んでいるときは、はい、呼び出されていない関数がたくさんあるので、コンパイラーが存在すべきでないと警告した場合でも、それらを保持する必要があるかもしれません。使用される可能性が低い場合は、コメントアウトすることをお勧めします。ただし、このコードがジャンクではないことを示す明確なマーカーを追加し、日付を追加します。チームの一員である場合は、片付ける前に連絡する必要があります。
DPD

DO-178によると、設計上正当化されていない未使用の機能は存在すべきではありません。
jinawee

0

私が選んだIDEはEclipseです。最初はセットアップが不格好で少し面倒ですが、私が手に入れるすべてのツールを検討する価値は十分にあります。そのようなツールの1つ(正式名称はわかりません)は、クラス、関数、変数などの未使用のコードについて通知します。IDEは、宣言の下に黄色の線を表示するだけです。これがマルチファイルプロジェクトで機能するかどうかは100%わかりませんが、いつでも試してみることができます。


0

IDEには通常、この機能が適切に実装されており、デフォルトで機能します(通常は無効にできます)。

デッドコードを見つけるために他の回答から選択する方法が何であれ、常にリフレクションの問題に注意してください。一部のメソッド/フィールドには、リフレクションのみでアクセスできます。これらのメソッドを削除しても、実行時を除き、アラームはトリガーされません。

あなたのプロジェクトのために書かれた(良い)テストがあれば、それらはこの状況で非常に価値があります。


0

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

$ cppcheck --enable=unusedFunction .
Checking foo.c...
1/2 files checked 0% done
Checking main.c...
2/2 files checked 0% done
[foo.c:1]: (style) The function 'foo' is never used.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.