Was sind die Unterschiede zwischen PMD und FindBugs?

107

Es gab eine Frage zum Vergleich von PMD und CheckStyle . Ich kann jedoch keine gute Aufschlüsselung der Unterschiede / Ähnlichkeiten zwischen PMD und FindBugs finden. Ich glaube, ein wesentlicher Unterschied besteht darin, dass PMD mit Quellcode arbeitet, während FindBugs mit kompilierten Bytecode-Dateien arbeitet. Aber sollte es in Bezug auf die Fähigkeiten eine Entweder-Oder-Wahl sein oder ergänzen sie sich?

Thomas Owens
quelle

Antworten:

151

Ich benutze beide. Ich denke, sie ergänzen sich.

Wie Sie sagten, arbeitet PMD mit Quellcode und findet daher Probleme wie: Verletzung von Namenskonventionen, Fehlen von geschweiften Klammern, falsch platzierte Nullprüfung, lange Parameterliste, unnötiger Konstruktor, fehlende Unterbrechung des Schalters usw. PMD informiert Sie auch über die Cyclomatic Komplexität Ihres Codes, die ich sehr hilfreich finde (FindBugs sagt nichts über die zyklomatische Komplexität aus).

FindBugs arbeitet mit Bytecode. Hier sind einige Probleme, die FindBugs findet, was PMD nicht tut: Die Methode equals () schlägt bei Subtypen fehl, die Klonmethode gibt möglicherweise null zurück, Referenzvergleich der Booleschen Werte, unmögliche Umwandlung, 32-Bit-Int um einen Betrag verschoben, der nicht im Bereich von 0-31 liegt. Eine Sammlung, die sich selbst enthält, entspricht immer der Methode true, eine Endlosschleife usw.

Normalerweise findet jeder von ihnen unterschiedliche Probleme. Verwende beide. Diese Tools haben mir viel darüber beigebracht, wie man guten Java-Code schreibt.

snakile
quelle
Was ist der spezifische Fehlercode, den Sie gesehen haben, als sich eine Sammlung selbst enthält, und warum ist dies ein wahrscheinlicher Fehler von FindBugs?
Geek
Nun, seit Sonarqube 6.3 nicht mehr ... Sonarqube braucht jetzt Java 8 und Findbugs unterstützt nur noch Java 7
Markus
22

Die beste Funktion von PMD sind die XPath-Regeln , die mit einem Regel-Designer gebündelt sind, damit Sie auf einfache Weise neue Regeln aus Codebeispielen erstellen können (ähnlich wie bei RegEx- und XPath-GUI-Buildern). FindBugs ist sofort stärker, aber es ist sehr wichtig, projektspezifische Regeln und Muster zu erstellen.

Zum Beispiel stieß ich auf ein Leistungsproblem mit 2 verschachtelten for-Schleifen, was zu einer Laufzeit von O (n ^ 2) führte, die leicht vermieden werden konnte. Ich habe PMD verwendet, um eine Ad-hoc-Abfrage zu erstellen und andere Instanzen von verschachtelten for-Schleifen zu überprüfen - // ForStatement / Statement // ForStatement. Dies wies auf zwei weitere Fälle des Problems hin. Dies ist überhaupt keine generische Regel.

Dekel
quelle
2

PMD ist

  • berühmt
  • weit verbreitet in der Industrie
  • Sie können Ihre Regeln in XML hinzufügen
  • bietet Ihnen eine detaillierte Analyse der Fehler- und Warnstufen
  • Sie können Ihren Code auch nach "Zeilen kopieren und einfügen" durchsuchen. Doppelter Code. Dies gibt eine gute Vorstellung von der Implementierung von Java oops.
kunal saxena
quelle
Spricht nicht mit FindBugs; Sie ergänzen sich, da ihre Problemstellungen nicht identisch sind.
Stevers