web-dev-qa-db-fra.com

Quelles sont les différences entre PMD et FindBugs?

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

104
Thomas Owens

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 comme: violation des conventions de dénomination, manque d'accolades, vérification nulle mal placée, longue liste de paramètres, constructeur inutile, rupture d'interrupteur manquante, etc. PMD vous parle également de la complexité cyclomatique 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, la conversion impossible, int 32 bits décalé d'une quantité non comprise entre 0 et 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 à écrire du bon code Java.

142
snakile

La meilleure fonctionnalité de PMD est son règles XPath, fourni avec un concepteur de règles pour vous permettre de construire facilement de nouvelles règles à partir d'exemples de code (similaires aux constructeurs RegEx et XPath GUI). FindBugs est plus fort, 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 imbriquées, résultant en un temps d'exécution O (n ^ 2), qui pourrait facilement être évité. J'ai utilisé PMD pour construire une requête ad-hoc, pour examiner d'autres instances de boucles 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.

22
Dekel

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". Code en double. Cela donne une bonne idée de l'implémentation de Java oops.
3
kunal saxena