8

FindBugs を使用して、ソース ツリーで未使用のメソッドを検出することは可能ですか? ユーザーがそれを行うと主張しているSOに関するいくつかの投稿、FBでこれを行う方法を尋ねる投稿、およびFBがこれを行うことができないと主張する投稿を目にします。

これがどのように行われるかを確実に知っている人はいますか?私は他の場所から明示的に呼び出されていないメソッドにのみ興味があり、リフレクションは気にしません。

4

8 に答える 8

13

FindBugs チームのメンバーとして、残念ながら FindBugs はこれを行わないことをお伝えします。私たちの Web サイトでバグ パターンを検索すると、「未使用」の検出器について言及されているのは未使用のフィールドのみです。

于 2011-01-20T20:08:44.427 に答える
2

私が現在取り組んでいるプロジェクトは、これだけです....それは非常に早い段階なので、おそらくたくさんのバグが残っています:

https://github.com/mebigfatguy/deadmethods

于 2011-01-24T04:19:02.267 に答える
1

Findbugsがプライベートで報告するのと同じように使用されていないパブリックメソッドについて報告することはかなり可能だと思います(それか私はコンパイラフラグを考えています:-)。

本当の問題は、なぜあなたも欲しいのかということです。閉じられて拡張されることのないプログラムを作成している場合は、未使用のメソッドを見つけることで、それらを削除する機会が得られます。しかし、APIを作成している場合、誰がそれらのメソッドを必要とするかを予測できないため、それらについて報告する意味はあまりありません。

于 2011-01-18T06:42:13.657 に答える
1

まあ、findbugs-1.3.9 の時点では、未使用のメソッドをキャッチしていないようです。

この小さなサンプルで findbugs を実行したとき:

public class TestJava
{
 int j;
 public static void main(String[] args)
 { 
   System.out.println("Nothing.");
 }
 public void foo()
 {
 }
 public static void bar()
 {
 }
}

foo も bar も未使用であることはわかりませんでした。TestJava.jが未使用のフィールドであることがわかりました。

Unused field
This field is never used.  Consider removing it from the class.

findbugs は完璧にはほど遠いですが、それでも非常に便利なツールです。

于 2011-01-18T06:50:11.100 に答える
1

回答した他の人からの警告にもかかわらず、このルートをたどりたいので:)、UPM検出器をコピーして変更して、必要なことを行うことができます。

FindBugs の検出器を作成するのは非常に簡単です (特に、優れた出発点がある場合)。これを読んで始めましょう

于 2011-01-18T07:00:58.697 に答える
0

未使用のメソッドの候補を見つけるための(私にとっての)最善のアプローチは、emmaなどのカバレッジツールを使用することです。

アプリケーションをインストルメント化し、過度に使用して、emmaログを調べます-セッション中に使用されなかったメソッドは使用されていない可能性があり、お気に入りのIDE(Eclipse、...)を使用して、訪問されていないメソッド呼び出し階層を調べることができます。

バグや他のコードアナライザーを見つけることで、未使用のメソッドを実際に検出できるとは思えません。

  • 他のライブラリによって呼び出されます(すべての非プライベートメソッドに対して)
  • リモートで呼び出されます
  • リフレクションAPIを介して呼び出されます(プライベートメソッドでも、技術的に話されています)
于 2011-01-18T06:42:21.587 に答える
0

たぶんcrap4jが必要です。単体テストが到達しないすべてのコードを削除します。もちろん、これはアプリを最小化するための難しい方法です。

于 2011-01-18T07:27:31.493 に答える
0

使用されていないコード (使用されていないパブリック メソッドを含む) を削除することは、難読化者が行うことの 1 つです。問題は、それを含むクラスを見ただけでは、パブリック メソッドが使用されているかどうかを実際に判断できないことです。public メソッドはどこからでも呼び出される可能性があるため、実行するシステム全体を調べる必要があります。

システム全体 (つまり、システムを実行するために使用されるコードとすべてのライブラリ) に対して難読化ツールを実行すると、呼び出されないパブリック メソッドを見つけるのに役立ちます (注意: リフレクションはもちろん、その結果を台無しにする可能性があります!)。

于 2011-01-18T07:23:50.947 に答える