В чем разница между PMD и FindBugs?

107

Возник вопрос сравнения PMD и CheckStyle . Однако я не могу найти подробного описания различий / сходств между PMD и FindBugs. Я считаю, что ключевое отличие состоит в том, что PMD работает с исходным кодом, а FindBugs работает с файлами скомпилированного байт-кода. Но с точки зрения возможностей, должен ли это быть выбор «или-или», или они дополняют друг друга?

Томас Оуэнс
источник

Ответы:

151

Я использую оба. Думаю, они дополняют друг друга.

Как вы сказали, PMD работает с исходным кодом и поэтому обнаруживает такие проблемы, как: нарушение соглашений об именах, отсутствие фигурных скобок, неправильная проверка нуля, длинный список параметров, ненужный конструктор, отсутствие разрыва в переключателе и т. Д. PMD также сообщает вам о Cyclomatic сложность вашего кода, который я считаю очень полезным (FindBugs не сообщает вам о цикломатической сложности).

FindBugs работает с байт-кодом. Вот некоторые проблемы, которые FindBugs обнаруживает, чего не делает PMD: метод equals () не работает для подтипов, метод clone может возвращать null, эталонное сравнение логических значений, невозможное приведение, 32-битное int, сдвинутое на величину, не находящуюся в диапазоне 0-31, коллекция, которая содержит себя, метод equals всегда возвращает true, бесконечный цикл и т. д.

Обычно каждый из них находит свой набор проблем. Используйте оба. Эти инструменты научили меня многому в том, как писать хороший Java-код.

змея
источник
Какой конкретный код ошибки вы видели, когда коллекция содержит саму себя, и почему FindBugs помечает это как вероятную ошибку?
Geek
ну, так как Sonarqube 6.3 больше не ... Sonarqube теперь нуждается в Java 8, а Findbugs пока поддерживает только Java 7
Маркус
22

Лучшая особенность PMD - это правила XPath в комплекте с конструктором правил, позволяющие легко создавать новые правила из примеров кода (аналогично построителям графического интерфейса RegEx и XPath). FindBugs по умолчанию сильнее, но очень важно создавать правила и шаблоны для конкретного проекта.

Например, я столкнулся с проблемой производительности, связанной с двумя вложенными циклами for, что привело к времени работы O (n ^ 2), чего можно было легко избежать. Я использовал PMD для создания специального запроса , чтобы просмотреть другие экземпляры вложенных циклов for - // ForStatement / Statement // ForStatement. Это указывало на еще 2 случая проблемы. Это не общее правило.

Декель
источник
2

PMD - это

  • известный
  • широко используется в промышленности
  • вы можете добавить свои правила в xml
  • дает вам подробный анализ уровней ошибок и предупреждений
  • вы также можете просканировать свой код на предмет «скопировать и вставить строки». Повторяющийся код. Это дает хорошее представление о реализации java oops.
кунал саксена
источник
Не разговаривает с FindBugs; они дополняют друг друга, поскольку их наборы задач не идентичны.
Stevers