Может findbugs обнаруживать неиспользуемые публичные методы - PullRequest
8 голосов
/ 18 января 2011

Можно ли обнаружить неиспользуемые методы в исходном дереве с помощью FindBugs? Я вижу некоторые посты на SO, где пользователи утверждают, что делают это, некоторые спрашивают, как это сделать в FB, а другие утверждают, что FB не может этого сделать.

Кто-нибудь знает наверняка, как это делается? Меня интересуют только методы, которые явно не вызываются из других источников, меня не волнует рефлексия.

Ответы [ 8 ]

13 голосов
/ 20 января 2011

как член команды FindBugs, я могу вам сказать, что, к сожалению, FindBugs не делает это.Если вы ищете на шаблонах ошибок на нашем сайте, единственное упоминание о «неиспользуемых» детекторах - это неиспользуемые поля .

2 голосов
/ 24 января 2011

У меня есть проект, над которым я сейчас работаю, и который делает именно это ... Это очень рано, поэтому, вероятно, осталось куча ошибок:

https://github.com/mebigfatguy/deadmethods

1 голос
/ 18 января 2011

Ну, так как вы хотите пойти по этому маршруту, несмотря на предупреждения от других, кто ответил :), вы можете скопировать и изменить UPM-детектор , чтобы сделать то, что вам нужно.* Очень просто написать детектор для FindBugs (особенно, когда у вас есть отличная отправная точка).Прочитайте это , чтобы начать

1 голос
/ 18 января 2011

Что касается 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 далек от совершенства, но все еще довольно полезный инструмент.

1 голос
/ 18 января 2011

Полагаю, что Findbugs вполне могли бы сообщать об открытых методах, которые не используются так же, как и о приватных (или то, или я думаю о флаге компилятора :-)

Реальный вопрос в том, зачем вам это тоже?Если вы пишете программу, которая закрыта и никогда не будет расширена, то обнаружение неиспользуемых методов дает вам возможность удалить их.Но если вы пишете API, вы не можете предсказать, кому понадобятся эти методы, поэтому нет смысла сообщать о них.

0 голосов
/ 18 января 2011

Может быть, crap4j - это то, что вам нужно. Это удаляет весь код, который не достигнут модульными тестами. Это, конечно, сложный способ свернуть ваше приложение.

0 голосов
/ 18 января 2011

Удаление неиспользуемого кода (включая неиспользуемые общедоступные методы) - это одна вещь, которую obfuscators делает. Проблема в том, что вы не можете точно определить, используется ли публичный метод, просто взглянув на класс, который его содержит. Вам нужно посмотреть на всю систему, которая будет работать, потому что открытый метод может быть вызван откуда угодно.

Запуск обфускатора для всей системы (т. Е. Вашего кода и всех библиотек, используемых для запуска системы) может помочь найти общедоступные методы, которые никогда не вызываются (конечно, caveat :lection может связываться с этим результатом!).

0 голосов
/ 18 января 2011

Лучший подход (для меня) найти кандидатов на неиспользуемые методы - использовать инструменты покрытия, такие как emma.

Инструментируйте свое приложение, используйте его чрезмерно и изучите журналы emma - методы, которые не использовалисьво время сеанса может быть неиспользованным, и вы можете использовать свою любимую среду IDE (eclipse, ...) для проверки иерархий вызовов невидимых методов.

Сомневаюсь, что найдены ошибки или любой другой кодАнализатор действительно может обнаружить неиспользуемые методы, потому что методы могут быть

  • , вызванными другими библиотеками (для всех не закрытых методов)
  • , удаленно вызванными
  • , вызванными через API отражения(даже частные методы, с технической точки зрения)
...