Quelles sont les différences entre PMD et FindBugs?


107

Il y avait une question comparant PMD et CheckStyle . Cependant, je ne peux pas trouver une bonne ventilation sur les différences / similitudes entre PMD et FindBugs. Je pense qu'une différence clé est que PMD fonctionne sur le code source, tandis que FindBugs fonctionne sur les fichiers bytecode compilés. Mais en termes de capacités, doit-il s'agir d'un choix ou / ou se complètent-ils?

Réponses:


151

J'utilise les deux. Je pense qu'ils se complètent.

Comme vous l'avez dit, PMD fonctionne sur le code source et trouve donc des problèmes tels que: violation des conventions de dénomination, manque d'accolades, vérification nulle mal placée, longue liste de paramètres, constructeur inutile, interrupteur manquant, etc. PMD vous informe également sur le Cyclomatic complexité de votre code que je trouve très utile (FindBugs ne vous parle pas de la complexité cyclomatique).

FindBugs fonctionne sur bytecode. Voici quelques problèmes que FindBugs trouve ce que PMD ne fait pas: la méthode equals () échoue sur les sous-types, la méthode clone peut retourner null, la comparaison de référence des valeurs booléennes, impossible de transtyper, 32 bits int décalé d'un montant qui ne se situe pas dans la plage de 0 à 31, une collection qui se contient, la méthode equals renvoie toujours true, une boucle infinie, etc.

Habituellement, chacun d'eux trouve un ensemble différent de problèmes. Utilise les deux. Ces outils m'ont beaucoup appris sur la façon d'écrire du bon code Java.


Quel est le code d'erreur spécifique que vous avez vu lorsqu'une collection se contient et pourquoi est-ce marqué comme un bogue probable par FindBugs?
Geek

bien depuis Sonarqube 6.3 n'est plus ... Sonarqube a besoin maintenant de Java 8 et Findbugs ne prend encore en charge que Java 7
Markus

22

La meilleure caractéristique de PMD est ses règles XPath , fournies avec un concepteur de règles pour vous permettre de créer facilement de nouvelles règles à partir d'exemples de code (similaires aux générateurs d'interface graphique RegEx et XPath). FindBugs est plus puissant dès le départ, mais la construction de règles et de modèles spécifiques au projet est très importante.

Par exemple, j'ai rencontré un problème de performances impliquant 2 boucles for imbriquées, entraînant un temps d'exécution O (n ^ 2), ce qui pourrait facilement être évité. J'ai utilisé PMD pour construire une requête ad-hoc , pour examiner d'autres instances de boucles for imbriquées - // ForStatement / Statement // ForStatement. Cela a souligné 2 autres cas du problème. Ce n'est pas du tout une règle générique.


2

PMD est

  • célèbre
  • largement utilisé dans l'industrie
  • vous pouvez ajouter vos règles en xml
  • vous donne une analyse détaillée des niveaux d'erreurs et des niveaux d'avertissement
  • vous pouvez également scanner votre code pour "copier et coller des lignes". Dupliquer le code. Cela donne une bonne idée de l'implémentation de java oops.

Ne parle pas à FindBugs; ils sont complémentaires car leurs ensembles de problèmes ne sont pas identiques.
Stevers le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.