Які відмінності між PMD та FindBugs?


107

Виникло питання порівняння PMD та CheckStyle . Однак я не можу знайти непогану поділку на відмінності / подібності між PMD та FindBugs. Я вважаю, що ключовою відмінністю є те, що PMD працює над вихідним кодом, тоді як FindBugs працює над компільованими файлами байт-кодів. Але з точки зору можливостей, чи повинен це бути чи / або вибір, чи вони доповнюють один одного?

Відповіді:


151

Я використовую і те, і інше. Я думаю, що вони доповнюють один одного.

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

FindBugs працює над байт- кодом . Ось деякі проблеми FindBugs знаходить, у яких PMD немає: метод equals () не вдається на підтипах, метод клонування може повернути нуль, порівняльне порівняння булевих значень, неможливий викид, 32-бітний int зміщений на величину, що не знаходиться в діапазоні 0-31, колекція, яка містить себе, метод рівних завжди повертає істину, нескінченний цикл тощо.

Зазвичай кожен з них знаходить різний набір проблем. Використовуйте обидва. Ці інструменти мене багато чому навчили писати хороший Java-код.


Який конкретний код помилки ви побачили, коли колекція містить себе, і чому саме позначення ймовірної помилки FindBugs?
Geek

а оскільки Sonarqube 6.3 вже не є ... Sonarqube вже потребує Java 8, а Findbugs підтримує лише Java 7
Markus

22

Найкращою особливістю PMD є його правила XPath , в комплекті з конструктором правил, що дозволяє легко створювати нові правила з зразків коду (подібно до RegEx та XPath GUI-будівельників). FindBugs виявляється сильнішим за межі сфери, але побудова конкретних правил та шаблонів проекту дуже важлива.

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


2

ПМД є

  • знаменитий
  • широко використовується в промисловості
  • ви можете додати свої правила в xml
  • надає детальний аналіз рівня помилок та рівнів попереджень
  • ви також можете сканувати свій код на предмет "скопіювати та вставити рядки". Дублікат коду. Це дає гарне уявлення про реалізацію java oops.

Не розмовляє з FindBugs; вони є взаємодоповнюючими, оскільки їх набори проблем не тотожні.
Стіверс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.