Risposte:
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 @SuppressFBWarnings
causa del conflitto di nome con Java SuppressWarnings
.
<dependency> <groupId>net.sourceforge.findbugs</groupId> <artifactId>annotations</artifactId> <version>1.3.2</version> <scope>provided</scope> </dependency>
<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
.
Come altri citati, puoi usare l' @SuppressFBWarnings
Annotazione. 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
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.
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
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
compile 'net.sourceforge.findbugs:annotations:1.3.2'
sintassi invece che è più breve.
testCompile 'com.google.code.findbugs:annotations:3.0.0'
nome del grado e dell'annotazione@SuppressFBWarnings
Al momento della stesura di questo (maggio 2018), FindBugs sembra essere stato sostituito da SpotBugs . L'uso SuppressFBWarnings
dell'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 .
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' provided
ambito:
<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 @SuppressFBWarnings
c'è 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.
Lascio questo qui: https://stackoverflow.com/a/14509697/1356953
Si noti che questo funziona con java.lang.SuppressWarnings
quindi 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.
java.lang.SuppressWarnings
non può funzionare. Ha la conservazione della fonte, quindi non è visibile ai bug di ricerca.