C'è un modo per ignorare un singolo avviso FindBugs?


195

Con PMD, se si desidera ignorare un avviso specifico, è possibile utilizzare // NOPMDper ignorare quella riga.

C'è qualcosa di simile per FindBugs?

Risposte:


310

L'approccio iniziale di FindBugs prevede file di configurazione XML, ovvero filtri . Questo è davvero meno conveniente della soluzione PMD ma FindBugs funziona su bytecode, non sul codice sorgente, quindi i commenti ovviamente non sono un'opzione. Esempio:

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

Tuttavia, per risolvere questo problema, FindBugs ha successivamente introdotto un'altra soluzione basata su annotazioni (vedi SuppressFBWarnings) che è possibile utilizzare a livello di classe o di metodo (a mio avviso più conveniente di XML). Esempio (forse non il migliore ma, beh, è ​​solo un esempio):

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

Si noti che poiché FindBugs 3.0.0 SuppressWarningsè stato deprecato a @SuppressFBWarningscausa del conflitto di nome con Java SuppressWarnings.


4
Domanda bonus: Come posso trovare il valore appropriato per un dato "bug" segnalato (usando il sonar)?
PlanBForOpenOffice

29
Il problema, ovviamente con l'uso dell'approccio annotativo, è che il tuo codice importa piuttosto inutilmente (e successiva dipendenza) la libreria Findbugs :(
Ashley Walton,

9
@AshleyWalton la conservazione delle annotazioni è CLASS, quindi almeno è solo una dipendenza dal tempo di compilazione
earcam

17
Per quegli utenti Maven, è possibile utilizzare quanto segue per importare le annotazioni. (Bonus, l'ambito è impostato in modo che il tuo progetto non dipenda da FindBugs in fase di esecuzione). <dependency> <groupId>net.sourceforge.findbugs</groupId> <artifactId>annotations</artifactId> <version>1.3.2</version> <scope>provided</scope> </dependency>
Bramp

7
Gli utenti Maven dovrebbero aggiungere <dependency><groupId>com.google.code.findbugs</groupId><artifactId>annotations</artifactId><version>3.0.0</version><scope>provided</scope></dependency>al proprio POM se lo desiderano @SuppressFBWarnings.
jansohn,

22

Come altri citati, puoi usare l' @SuppressFBWarningsAnnotazione. Se non vuoi o non puoi aggiungere un'altra Dipendenza al tuo codice, puoi aggiungere tu stesso l'annotazione al tuo codice, a Findbugs non importa in quale pacchetto si trova l'annotazione.

@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 "";
}

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


15

Ecco un esempio più completo di un filtro XML (l'esempio sopra da solo non funzionerà poiché mostra solo uno snippet e manca i <FindBugsFilter>tag di inizio e fine):

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

Se stai usando il plug-in FindBugs di Android Studio, vai al tuo file di filtro XML usando File-> Altre impostazioni-> Impostazioni predefinite-> Altre impostazioni-> TrovaBugs-IDEA-> Filtro-> Escludi file filtro-> Aggiungi.


10

Grado di aggiornamento

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

Individua il rapporto FindBugs

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

Trova il messaggio specifico

trova bug

Importa la versione corretta dell'annotazione

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

Aggiungi l'annotazione direttamente sopra il codice offensivo

@SuppressWarnings("OUT_OF_RANGE_ARRAY_INDEX")

Vedi qui per maggiori informazioni: findbugs Spring Annotation


1
È possibile utilizzare la compile 'net.sourceforge.findbugs:annotations:1.3.2'sintassi invece che è più breve.
kosiara - Bartosz Kosarzycki,

3
+1, ma aggiorna gentilmente la tua risposta con: testCompile 'com.google.code.findbugs:annotations:3.0.0'nome del grado e dell'annotazione@SuppressFBWarnings
Vlad.Bachurin

8

Al momento della stesura di questo (maggio 2018), FindBugs sembra essere stato sostituito da SpotBugs . L'uso SuppressFBWarningsdell'annotazione richiede che il codice sia compilato con Java 8 o versione successiva e introduce una dipendenza dal tempo di compilazione spotbugs-annotations.jar.

L'uso di un file filtro per filtrare le regole di SpotBugs non presenta tali problemi. La documentazione è qui .


Il tuo link a SpotBugs sembra essere errato. L'ho trovato su spotbugs.github.io invece.
Amedee Van Gasse,

1

Mentre altre risposte qui sono valide, non sono una ricetta completa per risolvere questo.

Nello spirito di completezza:

Devi avere le annotazioni findbugs nel tuo file pom - sono solo dei tempi di compilazione, quindi puoi usare l' providedambito:

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

Ciò consente l'uso di @SuppressFBWarningsc'è un'altra dipendenza che fornisce @SuppressWarnings. Tuttavia, quanto sopra è più chiaro.

Quindi aggiungi l'annotazione sopra il tuo metodo:

Per esempio

@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))) { ... }

Ciò include sia il nome del bug sia anche un motivo per cui stai disabilitando la scansione per esso.


-6

Lascio questo qui: https://stackoverflow.com/a/14509697/1356953

Si noti che questo funziona con java.lang.SuppressWarningsquindi non è necessario utilizzare un'annotazione separata.

@SuppressWarnings su un campo elimina solo gli avvisi findbugs riportati per quella dichiarazione di campo, non tutti gli avvisi associati a quel campo.

Ad esempio, questo elimina l'avviso "Campo sempre impostato su null":

@SuppressWarnings ("UWF_NULL_FIELD") String s = null; Penso che il meglio che puoi fare sia isolare il codice con l'avvertimento nel metodo più piccolo che puoi, quindi sopprimere l'avvertimento sull'intero metodo.


8
java.lang.SuppressWarningsnon può funzionare. Ha la conservazione della fonte, quindi non è visibile ai bug di ricerca.
Philip Aston,
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.