Einführung in FindBugs

1. Überblick

FindBugs ist ein Open Source-Tool, das zur statischen Analyse von Java-Code verwendet wird.

In diesem Artikel wird beschrieben, wie Sie FindBugs für ein Java-Projekt einrichten und in die IDE und den Maven-Build integrieren.

2. FindBugs Maven Plugin

2.1. Maven Konfiguration

Um statische Analyseberichte zu erstellen, müssen Sie zunächst das FindBugs-Plugin in unserer pom.xml hinzufügen:

<reporting>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>findbugs-maven-plugin</artifactId>
            <version>3.0.4</version>
        </plugin>
    </plugins>
</reporting>

2.2. Berichterstellung

Nachdem wir das Maven-Plugin nun ordnungsgemäß konfiguriert haben, erstellen wir die Projektdokumentation mit dem Befehl mvn site .

Der Bericht wird im Ordner target/site im Projektverzeichnis unter dem Namen findbugs.html erstellt.

Sie können auch den Befehl mvn findbugs: gui ausführen, um die GUI-Schnittstelle zu starten, um die generierten Berichte für das aktuelle Projekt zu durchsuchen.

Das FindBugs-Plugin kann auch so konfiguriert werden, dass es unter bestimmten Umständen fehlschlägt - indem Sie das Ausführungsziel check unserer Konfiguration hinzufügen:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>findbugs-maven-plugin</artifactId>
    <version>3.0.4</version>
    <configuration>
        <effort>Max</effort>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>check</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Das effort - Wenn es ausgereizt ist, führt es eine vollständigere und genauere Analyse durch, wodurch mehr Fehler im Code aufgedeckt werden, obwohl es mehr Ressourcen verbraucht und mehr Zeit in Anspruch nimmt.

Sie können jetzt den Befehl mvn verify ausführen, um zu überprüfen, ob der Build erfolgreich ist oder nicht - abhängig von den Fehlern, die während der Analyse festgestellt wurden.

Sie können auch den Berichterstellungsprozess verbessern und die Analyse besser steuern, indem Sie der Plug-In-Deklaration einige grundlegende Konfigurationen hinzufügen:

<configuration>
    <onlyAnalyze>org.baeldung.web.controller.** </onlyAnalyze>
    <omitVisitors>FindNullDeref</omitVisitors>
    <visitors>FindReturnRef</visitors>
</configuration>

Die Option onlyAnalyze deklariert kommagetrennte Werte von Klassen/Paketen, die für die Analyse geeignet sind.

Die visitors / omitVisitors -Optionen sind ebenfalls durch Kommas getrennte Werte. Sie werden verwendet, um anzugeben, welche Detektoren während der Analyse ausgeführt werden sollen/sollten. Beachten Sie, dass visitors und omitVisitors nicht gleichzeitig verwendet werden können .

Ein Detektor wird durch seinen Klassennamen ohne Paketqualifizierung angegeben. Die Details aller verfügbaren Detektorklassennamen finden Sie unter http://findbugs.sourceforge.net/api/edu/umd/cs/findbugs/detect/package-summary.html (Link zu diesem Link).

3. FindBugs Eclipse Plugin

3.1. Installation

Die IDE-Installation des FindBugs-Plugins ist ziemlich unkompliziert - Sie müssen lediglich die Software-Update-Funktion in Eclipse _, mit der folgenden Update-Site verwenden: http://findbugs.cs.umd.edu/eclipse . _

Um sicherzustellen, dass FindBugs ordnungsgemäß in Ihrer Eclipse-Umgebung installiert ist, suchen Sie nach der Option FindBugs unter Windows → Voreinstellungen → Java.

3.2. Durchsuchen von Berichten

Um eine statische Analyse für ein Projekt mithilfe des FindBugs Eclipse-Plugins zu starten, klicken Sie im Paket-Explorer mit der rechten Maustaste auf das Projekt. Klicken Sie anschließend auf die Option find bugs .

Nach dem Start zeigt Eclipse die Ergebnisse unter dem Bug Explorer-Fenster an, wie in der folgenden Abbildung dargestellt:

/uploads/bug__explorer.png%20652w Ab Version 2 begann FindBugs mit der Einstufung von Fehlern mit einer Skala von 1 bis 20, um die Schwere der Fehler zu messen:

  • Scariest : Rang zwischen 1

  • Unheimlich : Rang zwischen 5

  • Beunruhigend : Rang zwischen 10

  • Besorgnis : Platz zwischen 15

Während der Fehlergrad den Schweregrad beschreibt, spiegelt der Vertrauensfaktor die Wahrscheinlichkeit wider, dass diese Fehler als echte Fehler gekennzeichnet werden. Das Vertrauen hieß ursprünglich Priorität , wurde jedoch in der neuen Version umbenannt.

Natürlich können einige Fehler interpretiert werden und sie können sogar existieren, ohne das gewünschte Verhalten einer Software zu beeinträchtigen.

Aus diesem Grund müssen wir in einer realen Situation statische Analysewerkzeuge ordnungsgemäß konfigurieren, indem wir eine begrenzte Anzahl von Fehlern auswählen, die in einem bestimmten Projekt aktiviert werden sollen.

3.3. Eclipse-Konfiguration

Mit dem FindBugs-Plugin können Sie die Strategie zur Fehleranalyse einfach anpassen, indem Sie verschiedene Möglichkeiten zum Filtern von Warnungen und zur Begrenzung der Strenge der Ergebnisse anbieten. Sie können die Konfigurationsoberfläche überprüfen, indem Sie auf Fenster → Einstellungen → Java → FindBugs gehen:

Sie können unerwünschte Kategorien beliebig deaktivieren, den zu meldenden Mindestrang erhöhen, die Mindestzuverlässigkeit angeben, die gemeldet werden soll, und Marker für Fehlerreihen anpassen - Warnung, Info oder Fehler.

FindBugs teilen Fehler in viele Kategorien ein:

  • Korrektheit - sammelt allgemeine Fehler, z. unendliche schleifen,

unangemessene Verwendung von equals () usw Schlechte Praxis ** , z. Ausnahmenbehandlung, geöffnete Streams, Strings

Vergleich usw Leistung ** , z. Objekte im Leerlauf

Multithread-Korrektheit Sammelt Synchronisationsinkonsistenzen

und verschiedene Probleme in einer Multithread-Umgebung Internationalisierung ** - sammelt Probleme bei der Kodierung und

Internationalisierung der Anwendung Sicherheitslücke durch bösartigen Code ** - sammelt Sicherheitslücken im Code, z.

Codeausschnitte, die von potenziellen Angreifern ausgenutzt werden können Sicherheit ** - sammelt Sicherheitslücken in Bezug auf bestimmte Protokolle oder

SQL-Injektionen Dodgy ** - sammelt Code-Gerüche, z. nutzlose Vergleiche, Nullprüfungen,

ungenutzte Variablen usw

Auf der Registerkarte Detector Configuration können Sie die Regeln überprüfen, die Sie in Ihrem Projekt einhalten müssen:

  • Das Geschwindigkeitsattribut gibt an, wie teuer die Analyse ist ** . Je schneller der Detektor, desto geringer sind die Ressourcen, die zur Durchführung des Detektors benötigt werden.

Die vollständige Liste der von FindBugs erkannten Fehler finden Sie unter offizielle Dokumentationsseite .

Im Bereich Filter files können Sie benutzerdefinierte Dateifilter erstellen, um Teile der Codebasis ein- oder auszuschließen. Diese Funktion ist beispielsweise nützlich, wenn Sie verhindern möchten, dass "nicht verwalteter" oder "Papierkorb" -Code Fehler in den Berichten auftaucht oder beispielsweise alle Klassen vom Testpaket ausgeschlossen werden.

4. IntelliJ IDEA Plugin von FindBugs

4.1. Installation

Wenn Sie ein Fan von IntelliJ IDEA sind und mit der Untersuchung von Java-Code mit FindBugs beginnen möchten, können Sie das Plugin-Installationspaket einfach von der official JetBrains-Website herunterladen , und extrahieren Sie es in den Ordner% INSTALLATION__DIRECTORY%/plugins. Starten Sie Ihre IDE neu und Sie können loslegen.

Alternativ können Sie zu Einstellungen → Plugins navigieren und alle Repositorys nach FindBugs-Plugin durchsuchen.

Zum Zeitpunkt der Erstellung dieses Artikels ist die Version 1.0.1 des IntelliJ IDEA-Plugins gerade herausgekommen.

Um sicherzustellen, dass das FindBugs-Plugin ordnungsgemäß installiert ist, überprüfen Sie die Option "Projektcode analysieren" unter Analyze → FindBugs.

4.2. Durchsuchen von Berichten

Um die statische Analyse in IDEA zu starten, klicken Sie unter Analyse → FindBugs auf "Projektcode analysieren". Suchen Sie dann im FindBugs-IDEA-Fenster nach den Ergebnissen:

Sie können die zweite Befehlsspalte auf der linken Seite des Screenshots verwenden, um Fehler anhand verschiedener Faktoren zu gruppieren:

  1. Gruppieren Sie nach einer Fehlerkategorie.

  2. Nach einer Klasse gruppieren

  3. Nach einem Paket gruppieren.

  4. Gruppieren Sie nach einem Fehlerrang.

Sie können die Berichte auch im XML/HTML-Format exportieren, indem Sie in der vierten Spalte der Befehle auf die Schaltfläche „Exportieren“ klicken.

4.3. Aufbau

Die Einstellungsseiten des FindBugs-Plugins in IDEA sind ziemlich selbsterklärend:

Dieses Einstellungsfenster ist dem von Eclipse sehr ähnlich. Daher können Sie alle Arten der Konfiguration auf analoge Weise durchführen, beginnend mit dem Analyseaufwandniveau, der Fehlerbewertung, der Zuverlässigkeit, den Klassenfilter usw.

Auf das Einstellungsfenster können Sie in IDEA zugreifen, indem Sie auf das Symbol „Plugin-Voreinstellungen“ unter dem Fenster „FindBugs-IDEA“ klicken.

5. Berichtsanalyse für das Spring-Rest-Projekt

In diesem Abschnitt werden wir ein wenig Licht auf eine statische Analyse werfen, die am Beispiel https://github.com/eugenp/tutorials/tree/master/spring-rest [spring-rest auf Github verfügbar ist.

Die meisten Mängel sind geringfügig - von Belang, aber sehen wir uns an, wie wir einige davon beheben können.

  • Methode ignoriert außergewöhnlichen Rückgabewert: **

File fileServer = new File(fileName);
fileServer.createNewFile();

Wie Sie sich vermutlich denken können, beklagt sich FindBugs darüber, dass wir den Rückgabewert der createNewFile () -Methode wegwerfen. Ein möglicher Fix wäre, den zurückgegebenen Wert in einer neu deklarierten Variablen zu speichern und dann etwas bedeutungsvoll mit der DEBUG-Protokollebene zu protokollieren - z. " Die benannte Datei ist nicht vorhanden und wurde erfolgreich erstellt ", wenn der zurückgegebene Wert true ist.

  • Die Methode schließt möglicherweise den Stream ausnahmsweise nicht: Dieser bestimmte Fehler veranschaulicht einen typischen Anwendungsfall für die Ausnahmebehandlung, der vorschlägt, Streams in einem finally -Block immer zu schließen **

try {
    DateFormat dateFormat
      = new SimpleDateFormat("yyyy__MM__dd__HH.mm.ss");
    String fileName = dateFormat.format(new Date());
    File fileServer = new File(fileName);
    fileServer.createNewFile();
    byte[]bytes = file.getBytes();
    BufferedOutputStream stream
      = new BufferedOutputStream(new FileOutputStream(fileServer));
    stream.write(bytes);
    stream.close();
    return "You successfully uploaded " + username;
} catch (Exception e) {
    return "You failed to upload " + e.getMessage();
}

Wenn vor der Anweisung stream.close () eine Ausnahme ausgelöst wird, wird der Stream nie geschlossen. Aus diesem Grund ist es immer vorzuziehen, den finally \ {} - Block zu verwenden, um Streams zu schließen, die während einer try / catch -Routine geöffnet wurden.

  • Eine Exception wird abgefangen, wenn Exception nicht ausgelöst wird. ** : Wie Sie vielleicht bereits wissen, ist das Abfangen von Exception eine schlechte Codierungsmethode. FindBugs ist der Meinung, dass Sie eine bestimmte Ausnahme abfangen müssen, damit Sie sie richtig behandeln können. Grundsätzlich wäre es bei der Bearbeitung von Streams in einer Java-Klasse besser, IOException abzufangen als eine generischere Ausnahme.

  • Feld im Konstruktor nicht initialisiert, aber ohne Nullprüfung dereferenziert ** : Es ist immer eine gute Idee, Felder innerhalb von Konstruktoren zu initialisieren. Andernfalls sollten wir mit der Möglichkeit leben, dass der Code eine https://docs.oracle.com/javase auslöst/7/docs/api/java/lang/NullPointerException.html[NPE…​ Es wird daher empfohlen, Nullprüfungen durchzuführen, wenn wir nicht sicher sind, ob die Variable ordnungsgemäß initialisiert ist oder nicht.

6. Fazit

In diesem Artikel haben wir die grundlegenden Schlüsselpunkte für die Verwendung und Anpassung von FindBugs in einem Java-Projekt behandelt.

Wie Sie sehen können, ist FindBugs ein leistungsfähiges und dennoch einfaches statisches Analysewerkzeug. Es hilft, potenzielle Qualitätslöcher in Ihrem System zu erkennen - wenn es richtig eingestellt und verwendet wird.

Schließlich ist es erwähnenswert, dass FindBugs auch als Teil eines separaten Tools zur automatischen automatischen Codeüberprüfung wie Sputnik ausgeführt werden kann. Dies kann sehr hilfreich sein, um die Berichte deutlich sichtbarer zu machen .

Der für die statische Analyse verwendete Beispielcode ist verfügbar unter over auf Github .