Каковы различия между PMD и FindBugs?

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

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

PMD

  • известный
  • широко используется в промышленности
  • вы можете добавить свои правила в xml
  • дает подробный анализ уровней ошибок и уровней предупреждений
  • вы также можете отсканировать свой код для "копировать и вставлять строки". Дублировать код. Это дает хорошее представление об использовании java oops.