Quali sono le differenze tra PMD e FindBugs?


107

C'era una domanda che confrontava PMD e CheckStyle . Tuttavia, non riesco a trovare una bella ripartizione delle differenze / somiglianze tra PMD e FindBugs. Credo che una differenza fondamentale sia che PMD funziona sul codice sorgente, mentre FindBugs funziona sui file bytecode compilati. Ma in termini di capacità, dovrebbe essere una scelta o / o o si completano a vicenda?

Risposte:


151

Sto usando entrambi. Penso che si completino a vicenda.

Come hai detto, PMD lavora sul codice sorgente e quindi trova problemi come: violazione delle convenzioni di denominazione, mancanza di parentesi graffe, controllo null fuori posto, lungo elenco di parametri, costruttore non necessario, interruzione mancante nell'interruttore, ecc. PMD ti parla anche di Cyclomatic complessità del tuo codice che trovo molto utile (FindBugs non ti parla della complessità Cyclomatic).

FindBugs funziona su bytecode. Ecco alcuni problemi che FindBugs trova che PMD non riesce a trovare: il metodo equals () fallisce sui sottotipi, il metodo clone può restituire null, confronto di riferimento di valori booleani, cast impossibile, int a 32 bit spostato di una quantità non compresa nell'intervallo 0-31, una raccolta che contiene se stessa, il metodo equals restituisce sempre true, un ciclo infinito, ecc.

Di solito ognuno di loro trova un diverso insieme di problemi. Usali entrambi. Questi strumenti mi hanno insegnato molto su come scrivere un buon codice Java.


Qual è il codice di errore specifico che hai visto quando una raccolta contiene se stessa e perché è stato contrassegnato come probabile bug da FindBugs?
Geek

bene da quando Sonarqube 6.3 non è più ... Sonarqube ha bisogno di Java 8 e Findbugs supporta ancora Java 7
Markus

22

La caratteristica migliore di PMD sono le sue regole XPath , in bundle con un Rule Designer per consentire di costruire facilmente nuove regole da esempi di codice (simili a RegEx e XPath GUI builder). FindBugs è più forte fuori dagli schemi, ma la costruzione di regole e modelli specifici del progetto è molto importante.

Ad esempio, ho riscontrato un problema di prestazioni che coinvolgeva 2 cicli for nidificati, risultando in un tempo di esecuzione O (n ^ 2), che potrebbe essere facilmente evitato. Ho usato PMD per costruire una query ad-hoc , per rivedere altre istanze di cicli for nidificati - // ForStatement / Statement // ForStatement. Ciò ha evidenziato altri 2 casi del problema. Questa non è una regola generica di sorta.


2

PMD è

  • famoso
  • ampiamente utilizzato nell'industria
  • puoi aggiungere le tue regole in xml
  • fornisce un'analisi dettagliata nei livelli di errore e nei livelli di avviso
  • puoi anche scansionare il tuo codice per "copiare e incollare righe". Codice duplicato. Questo dà una buona idea sull'implementazione di java oops.

Non parla con FindBugs; sono complementari poiché i loro insiemi di problemi non sono identici.
Stevers,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.