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?
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.
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.
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.
la source
PMD est
la source