Allgemeines
FindBugs ist ein Open Source Programm, das statische Code Analyse verwendet um Java Programme auf zahlreiche Bugs zu untersuchen. Das Tool ist in Java geschrieben und kann Programme jeder Java Version überprüfen.
- Homepage
- aktuelle Version: 1.3.7 (Release 30.12.08)
- entiwickelt an der University of Maryland
- bis heute über 700.000 Downloads
- finanzielle Unterstützung u.a. durch Google und Sun
- Open Source Lizenz: Lesser GNU Public License (LGPL)
- Benutzung:
- stand-alone Version mit Kommandozeile, ANT und GUI
- Eclipse Plugin
- third-party Plugins für Maven und NetBeans
FindBugs basiert auf dem Konzept der Bug Patterns. Diese sind verwandt mit den Anti Patterns (Software Design Muster, die erwiesenermaßen immer wieder fehlschlagen). Im Gegensatz zu den Anti Patterns, welche Design Muster darstellen, sind Bug Patterns Muster von fehlerhaftem Programmverhalten in Verbindung mit Programmierfehlern.
FindBugs untersucht nun Java Bytecode nach diesen Mustern. Der Quelltext wird also nicht benötigt, nur das Kompilat (.class Dateien) muss vorhanden sein. Der Quelltext reicht natürlich auch aus, er muss dann nur vor der Untersuchung kompiliert werden.
FindBugs stellt eine Plugin Architektur bereit, die es jedem erlaubt eigene Bug Detektoren hinzuzufügen, sofern man mit dem Java Bytecode vertraut ist. Um den Bytecode zu analysieren benutzt FindBugs die Byte Code Engineering Library (BCEL) von Apache.
Die Analyse von FindBugs ist teilweise ungenau und es kommt zu sogenannten false warnings, also Meldungen die bei einer korrekten Codestelle einen Bug anzeigen. Laut den Entwicklern liegt die Rate dieser Falschmeldungen in der Praxis bei unter 50%.
Bug Kategorien
FindBugs teilt die Bugs, nach denen gesucht wird in verschiedene Kategorien auf:- Correctness:
Wichtigste Kategorie, enthält offensichtliche Fehler im Code (z.B. ) - Bad Practice:
Verletzung von empfohlener, grundlegender Codeanwendung (z.B. ) - Dodgy:
fragwürdige, verwirrende Codestellen (z.B. ) - Multithreaded Correctness:
siehe Correctness, nur bezogen auf Multithreading - Performance:
Codestellen, die die Performance verschlechtern (z.B. ) - Security:
Codestellen, die ein Sicherheitsrisiko darstellen (z.B. Passwort mitten im Quelltext) - Malicious Code Vulnerability:
Verletzbarkeit durch bösartigen Code - Internationalization:
z.B. Probleme bei verschiedenen Encodings und internationalen Sonderzeichen - Experimental:
enthält noch nicht endgültige Bug Patterns, werden gerade entwickelt
Anwendung unter Eclipse
Über die Projekteinstellungen gelangt man zu den Einstellungen des Plugins. Hiererhält man eine Übersicht über alle verfügbaren Bug Detektoren und Informationen über diese (Bug ID, Geschwindigkeit, Kategorie, Beschreibung). Diese Detektoren sowie gesamte Bug Kategorien lassen sich hier an- bzw. ausschalten.
Durch einen Rechtsklick auf ein Projekt, ein Paket, eine Klasse oder ein Interface und Auswählen des Menüpunkts Find Bugs > Find Bugs wird das Paket/die Klasse/... auf Bugs untersucht.
Die gefundenen Bugs erkennt man an den Käfern am linken Rand des Editorfensters und im "Problems"-Fenster. Die Farbe der Käfer entspricht der Priorität des Bugs: rot (hoch), orange (normal), gelb (niedrig). Sind in einer Zeile mehrere Bugs enthalten so entspricht die Farbe des Käfers der Priorität des ersten gefundenen Bugs.
Die Bugbeschreibung erhält man entweder indem man mit der Maus über einen Käfer fährt oder im "Problems"-Fenster. Vor der Beschreibung des jeweiligen Bugs stehen immer mehrere Großbuchstaben. Diese geben Folgendes an:
- Der erste Buchstabe steht für die Priorität des Bugs (H für hoch, N für normal oder niedrig)
- Der zweite Buchstabe gibt die Kategorie des Bugs an (z.B. C für Correctness, B für Bad Practice usw.)
- In der dritten Spalte steht die Bug ID. Mit dieser lässt sich ein Bug in der Bugübersicht in den Einstellungen leichter finden
Hier wurden nun u.a. folgende Bugs erkannt:
- In Zeile 10 (im Editorfenster) sehen wir links einen gelben Käfer. Dieser zeigt einen Bug niedriger Priorität an.
Fahren wir mit der Maus über den Käfer oder sehen im "Problems"-Fenster nach, bekommen wir folgende Information:
N P UPM: Private method D.dummy() is never called
Es handelt sich also um eine Bug der Kategorie Performance mit niedriger Priorität und der Bug ID UPM. Der Bug selber besteht darin, dass die Methode dummy() zwar deklariert wurde aber nie benutzt wird. - Zeile 11:
H C DLS: Overwritten increment in D.dummy()
Ein Bug der Kategorie Correctness mit hoher Priorität: Das Inkrement (i1++) wird mit dem alten Wert von i1 überschrieben. - Zeile 13:
N P UM: Method calls static Math class method on a constant value
Ein Performance Bug mit niedriger Priorität: Es wird eine mathematische Funktion für eine Konstante berechnet, deren Ergebnis nicht extra berechnet werden sollte. Dies gilt z.B. für sin(0.0) = 0, cos(0.0) = 0, arccos(1.0) = 0, usw.. Diese Werte sollte man zugunsten der Performanz und der Genauigkeit nicht berechnen lassen. - Zeile 15:
H C FS: Argument of type String can't be handled by format specifier %d in D.dummy()
Ein Correctness Bug hoher Priorität: Der Formatstring erwartet einen Integer-Wert, übergeben wird jedoch ein String. - Zeile 18:
H C RV: D.dummy() ignores return value of String.trim()
Ein Correctness Bug hoher Priorität: Der Rückgabewert der String-Funktion trim() wird nicht berücksichtigt. In diesem Fall hat das trim() überhaupt keinen Effekt auf den String s1. Richtig wäre:s1 = s1.trim();