Gibt es eine Möglichkeit, eine einzelne FindBugs-Warnung zu ignorieren?

194

Wenn Sie mit PMD eine bestimmte Warnung ignorieren möchten, können Sie // NOPMDdiese Zeile ignorieren lassen.

Gibt es etwas Ähnliches für FindBugs?

Ben S.
quelle

Antworten:

308

Der anfängliche Ansatz von FindBugs umfasst XML-Konfigurationsdateien, auch Filter genannt . Dies ist wirklich weniger praktisch als die PMD-Lösung, aber FindBugs arbeitet mit Bytecode, nicht mit dem Quellcode, sodass Kommentare offensichtlich keine Option sind. Beispiel:

<Match>
   <Class name="com.mycompany.Foo" />
   <Method name="bar" />
   <Bug pattern="DLS_DEAD_STORE_OF_CLASS_LITERAL" />
</Match>

Um dieses Problem zu lösen, führte FindBugs später eine andere Lösung ein, die auf Anmerkungen basiert (siehe SuppressFBWarnings), die Sie auf Klassen- oder Methodenebene verwenden können (meiner Meinung nach bequemer als XML). Beispiel (vielleicht nicht das beste, aber es ist nur ein Beispiel):

@edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
    value="HE_EQUALS_USE_HASHCODE", 
    justification="I know what I'm doing")

Beachten Sie, dass FindBugs 3.0.0 aufgrund des Namenskonflikts mit Java SuppressWarningszugunsten von veraltet @SuppressFBWarningsist SuppressWarnings.

Pascal Thivent
quelle
4
Bonusfrage: Wie finde ich den geeigneten Wert für einen bestimmten gemeldeten "Fehler" (mithilfe von Sonar)?
PlanBForOpenOffice
29
Das Problem bei der Verwendung des Annotation-Ansatzes ist natürlich, dass Ihr Code die Findbugs-Bibliothek ziemlich unnötig importiert (und anschließend abhängig macht) :(
Ashley Walton
9
@AshleyWalton die Aufbewahrung der Anmerkungen ist KLASSE, so dass es zumindest nur eine Abhängigkeit von der Kompilierungszeit ist
earcam
17
Für diese Maven-Benutzer können Sie die Anmerkungen wie folgt importieren. (Bonus, der Umfang ist so festgelegt, dass Ihr Projekt zur Laufzeit nicht von FindBugs abhängt.) <dependency> <groupId>net.sourceforge.findbugs</groupId> <artifactId>annotations</artifactId> <version>1.3.2</version> <scope>provided</scope> </dependency>
Bramp
7
Maven-Benutzer sollten <dependency><groupId>com.google.code.findbugs</groupId><artifactId>annotations</artifactId><version>3.0.0</version><scope>provided</scope></dependency>ihren POM erweitern, wenn sie ihn verwenden möchten @SuppressFBWarnings.
jansohn
22

Wie bereits erwähnt, können Sie die @SuppressFBWarningsAnmerkung verwenden. Wenn Sie Ihrem Code keine weitere Abhängigkeit hinzufügen möchten oder können, können Sie die Anmerkung selbst zu Ihrem Code hinzufügen. Findbugs ist es egal, in welchem ​​Paket sich die Anmerkung befindet.

@Retention(RetentionPolicy.CLASS)
public @interface SuppressFBWarnings {
    /**
     * The set of FindBugs warnings that are to be suppressed in
     * annotated element. The value can be a bug category, kind or pattern.
     *
     */
    String[] value() default {};

    /**
     * Optional documentation of the reason why the warning is suppressed
     */
    String justification() default "";
}

Quelle: https://sourceforge.net/p/findbugs/feature-requests/298/#5e88

hinneLinks
quelle
15

Hier ist ein vollständigeres Beispiel für einen XML-Filter (das obige Beispiel allein funktioniert nicht, da nur ein Snippet angezeigt wird und die <FindBugsFilter>Start- und End-Tags fehlen ):

<FindBugsFilter>
    <Match>
        <Class name="com.mycompany.foo" />
        <Method name="bar" />
        <Bug pattern="NP_BOOLEAN_RETURN_NULL" />
    </Match>
</FindBugsFilter>

Wenn Sie das Android Studio FindBugs-Plugin verwenden, navigieren Sie zu Ihrer XML-Filterdatei über Datei-> Andere Einstellungen-> Standardeinstellungen-> Andere Einstellungen-> FindBugs-IDEA-> Filter-> Filterdateien ausschließen-> Hinzufügen.

mbonness
quelle
10

Gradle aktualisieren

dependencies {
    compile group: 'findbugs', name: 'findbugs', version: '1.0.0'
}

Suchen Sie den FindBugs-Bericht

Datei: ///Users/your_user/IdeaProjects/projectname/build/reports/findbugs/main.html

Suchen Sie die spezifische Nachricht

finde Fehler

Importieren Sie die richtige Version der Anmerkung

import edu.umd.cs.findbugs.annotations.SuppressWarnings;

Fügen Sie die Anmerkung direkt über dem fehlerhaften Code hinzu

@SuppressWarnings("OUT_OF_RANGE_ARRAY_INDEX")

Weitere Informationen finden Sie hier: findbugs Spring Annotation

anataliocs
quelle
1
Sie können compile 'net.sourceforge.findbugs:annotations:1.3.2'stattdessen eine kürzere Syntax verwenden.
Kosiara - Bartosz Kosarzycki
3
+1, aber bitte aktualisieren Sie Ihre Antwort mit: Gradle testCompile 'com.google.code.findbugs:annotations:3.0.0'und Annotation Name@SuppressFBWarnings
Vlad.Bachurin
8

Zum Zeitpunkt des Schreibens (Mai 2018) scheint FindBugs durch SpotBugs ersetzt worden zu sein . Für die Verwendung der SuppressFBWarningsAnnotation muss Ihr Code mit Java 8 oder höher kompiliert werden, und es wird eine Abhängigkeit von der Kompilierungszeit eingeführt spotbugs-annotations.jar.

Die Verwendung einer Filterdatei zum Filtern von SpotBugs-Regeln weist keine derartigen Probleme auf. Die Dokumentation finden Sie hier .

Steve
quelle
Ihr Link zu SpotBugs scheint falsch zu sein. Ich habe es stattdessen bei spotbugs.github.io gefunden .
Amedee Van Gasse
1

Während andere Antworten hier gültig sind, sind sie kein vollständiges Rezept, um dies zu lösen.

Im Sinne der Vollständigkeit:

Sie müssen die Findbugs-Annotationen in Ihrer POM-Datei haben - sie haben nur Kompilierungszeit, damit Sie den folgenden providedBereich verwenden können:

<dependency>
  <groupId>com.google.code.findbugs</groupId>
  <artifactId>findbugs-annotations</artifactId>
  <version>3.0.1</version>
  <scope>provided</scope>
</dependency>

Dies ermöglicht die Verwendung einer @SuppressFBWarningsanderen Abhängigkeit, die bereitstellt @SuppressWarnings. Das Obige ist jedoch klarer.

Dann fügen Sie die Anmerkung über Ihrer Methode hinzu:

Z.B

@SuppressFBWarnings(value = "RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE",
        justification = "Scanning generated code of try-with-resources")
@Override
public String get() {
    try (InputStream resourceStream =  owningType.getClassLoader().getResourceAsStream(resourcePath);
         BufferedReader reader = new BufferedReader(new InputStreamReader(resourceStream, UTF_8))) { ... }

Dies beinhaltet sowohl den Namen des Fehlers als auch einen Grund, warum Sie den Scan dafür deaktivieren.

Ashley Frieze
quelle
-6

Ich werde dieses hier lassen: https://stackoverflow.com/a/14509697/1356953

Bitte beachten Sie, dass dies funktioniert, java.lang.SuppressWarningssodass keine separate Anmerkung erforderlich ist.

@SuppressWarnings in einem Feld unterdrückt nur Findbugs-Warnungen, die für diese Felddeklaration gemeldet wurden, nicht jede Warnung, die diesem Feld zugeordnet ist.

Dies unterdrückt beispielsweise die Warnung "Feld immer nur auf Null gesetzt":

@SuppressWarnings ("UWF_NULL_FIELD") String s = null; Ich denke, das Beste, was Sie tun können, ist, den Code mit der Warnung in die kleinste Methode zu isolieren, die Sie können, und dann die Warnung für die gesamte Methode zu unterdrücken.

00500005
quelle
8
java.lang.SuppressWarningskann nicht arbeiten. Es hat eine Quellenaufbewahrung und ist daher für Findbugs nicht sichtbar.
Philip Aston