Réponses:
L'approche initiale de FindBugs implique des fichiers de configuration XML appelés filtres . C'est vraiment moins pratique que la solution PMD mais FindBugs fonctionne sur le bytecode, pas sur le code source, donc les commentaires ne sont évidemment pas une option. Exemple:
<Match>
<Class name="com.mycompany.Foo" />
<Method name="bar" />
<Bug pattern="DLS_DEAD_STORE_OF_CLASS_LITERAL" />
</Match>
Cependant, pour résoudre ce problème, FindBugs a ensuite introduit une autre solution basée sur des annotations (voir SuppressFBWarnings
) que vous pouvez utiliser au niveau de la classe ou de la méthode (plus pratique que XML à mon avis). Exemple (peut-être pas le meilleur mais bon, ce n'est qu'un exemple):
@edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
value="HE_EQUALS_USE_HASHCODE",
justification="I know what I'm doing")
Notez que depuis FindBugs 3.0.0 SuppressWarnings
a été déconseillé en @SuppressFBWarnings
raison de la collision de noms avec 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>
à leur POM s'ils souhaitent utiliser @SuppressFBWarnings
.
Comme d'autres l'ont mentionné, vous pouvez utiliser l' @SuppressFBWarnings
annotation. Si vous ne voulez pas ou ne pouvez pas ajouter une autre dépendance à votre code, vous pouvez ajouter l'annotation à votre code vous-même, Findbugs ne se soucie pas du package de l'annotation.
@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 "";
}
Source: https://sourceforge.net/p/findbugs/feature-requests/298/#5e88
Voici un exemple plus complet d'un filtre XML (l'exemple ci-dessus en lui-même ne fonctionnera pas car il ne montre qu'un extrait de code et il manque les <FindBugsFilter>
balises de début et de fin):
<FindBugsFilter>
<Match>
<Class name="com.mycompany.foo" />
<Method name="bar" />
<Bug pattern="NP_BOOLEAN_RETURN_NULL" />
</Match>
</FindBugsFilter>
Si vous utilisez le plug-in Android Studio FindBugs, accédez à votre fichier de filtre XML en utilisant Fichier-> Autres paramètres-> Paramètres par défaut-> Autres paramètres-> FindBugs-IDEA-> Filtre-> Exclure les fichiers de filtre-> Ajouter.
Mettre à jour Gradle
dependencies {
compile group: 'findbugs', name: 'findbugs', version: '1.0.0'
}
Localisez le rapport FindBugs
fichier: ///Users/your_user/IdeaProjects/projectname/build/reports/findbugs/main.html
Trouver le message spécifique
Importez la version correcte de l'annotation
import edu.umd.cs.findbugs.annotations.SuppressWarnings;
Ajoutez l'annotation directement au-dessus du code incriminé
@SuppressWarnings("OUT_OF_RANGE_ARRAY_INDEX")
Voir ici pour plus d'informations: findbugs Spring Annotation
compile 'net.sourceforge.findbugs:annotations:1.3.2'
place une syntaxe plus courte.
testCompile 'com.google.code.findbugs:annotations:3.0.0'
et nom d'annotation@SuppressFBWarnings
Au moment d'écrire ces lignes (mai 2018), FindBugs semble avoir été remplacé par SpotBugs . L'utilisation de l' SuppressFBWarnings
annotation nécessite que votre code soit compilé avec Java 8 ou version ultérieure et introduit une dépendance de temps de compilation sur spotbugs-annotations.jar
.
L'utilisation d'un fichier de filtre pour filtrer les règles SpotBugs n'a pas de tels problèmes. La documentation est ici .
Bien que d'autres réponses ici soient valables, elles ne sont pas une recette complète pour résoudre ce problème.
Dans un esprit d'exhaustivité:
Vous devez avoir les annotations findbugs dans votre fichier pom - elles ne sont qu'au moment de la compilation, vous pouvez donc utiliser la provided
portée:
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>findbugs-annotations</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
Cela permet d'utiliser @SuppressFBWarnings
une autre dépendance qui fournit @SuppressWarnings
. Cependant, ce qui précède est plus clair.
Ensuite, vous ajoutez l'annotation au-dessus de votre méthode:
Par exemple
@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))) { ... }
Cela inclut à la fois le nom du bogue et également une raison pour laquelle vous désactivez l'analyse pour celui-ci.
Je vais laisser celui-ci ici: https://stackoverflow.com/a/14509697/1356953
Veuillez noter que cela fonctionne avec java.lang.SuppressWarnings
donc pas besoin d'utiliser une annotation séparée.
@SuppressWarnings sur un champ supprime uniquement les avertissements findbugs signalés pour cette déclaration de champ, pas tous les avertissements associés à ce champ.
Par exemple, cela supprime l'avertissement «Le champ n'est jamais défini sur null»:
@SuppressWarnings ("UWF_NULL_FIELD") String s = null; Je pense que le mieux que vous puissiez faire est d'isoler le code avec l'avertissement dans la plus petite méthode possible, puis de supprimer l'avertissement sur toute la méthode.
java.lang.SuppressWarnings
ne peut pas fonctionner. Il a une rétention de source, il n'est donc pas visible pour les bogues.