Existe-t-il un moyen d'ignorer un seul avertissement FindBugs?

194

Avec PMD, si vous voulez ignorer un avertissement spécifique, vous pouvez utiliser // NOPMDpour ignorer cette ligne.

Existe-t-il quelque chose de similaire pour FindBugs?

Ben S
la source

Réponses:

308

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 SuppressWarningsa été déconseillé en @SuppressFBWarningsraison de la collision de noms avec Java SuppressWarnings.

Pascal Thivent
la source
4
Question bonus: Comment puis-je trouver la valeur appropriée pour un "bug" donné (en utilisant le sonar)?
PlanBForOpenOffice
29
Le problème, bien sûr, avec l'utilisation de l'approche d'annotation est que votre code importe plutôt inutilement (et dépendances ultérieures) la bibliothèque Findbugs :(
Ashley Walton
9
@AshleyWalton la rétention des annotations est CLASS, donc au moins ce n'est qu'une dépendance de temps de compilation
earcam
17
Pour ces utilisateurs Maven, vous pouvez utiliser ce qui suit pour importer les annotations. (Bonus, la portée est définie de sorte que votre projet ne dépend pas de FindBugs lors de l'exécution). <dependency> <groupId>net.sourceforge.findbugs</groupId> <artifactId>annotations</artifactId> <version>1.3.2</version> <scope>provided</scope> </dependency>
bramp
7
Les utilisateurs de Maven doivent ajouter <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.
jansohn
22

Comme d'autres l'ont mentionné, vous pouvez utiliser l' @SuppressFBWarningsannotation. 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

hinneLinks
la source
15

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.

mbonness
la source
10

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

trouver des bugs

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

anataliocs
la source
1
Vous pouvez utiliser à la compile 'net.sourceforge.findbugs:annotations:1.3.2'place une syntaxe plus courte.
kosiara - Bartosz Kosarzycki
3
+1, mais veuillez mettre à jour votre réponse avec: gradle testCompile 'com.google.code.findbugs:annotations:3.0.0'et nom d'annotation@SuppressFBWarnings
Vlad.Bachurin
8

Au moment d'écrire ces lignes (mai 2018), FindBugs semble avoir été remplacé par SpotBugs . L'utilisation de l' SuppressFBWarningsannotation 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 .

Steve
la source
Votre lien vers SpotBugs semble incorrect. Je l' ai plutôt trouvé sur spotbugs.github.io .
Amedee Van Gasse
1

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 providedporté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 @SuppressFBWarningsune 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.

Ashley Frieze
la source
-6

Je vais laisser celui-ci ici: https://stackoverflow.com/a/14509697/1356953

Veuillez noter que cela fonctionne avec java.lang.SuppressWarningsdonc 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.

00500005
la source
8
java.lang.SuppressWarningsne peut pas fonctionner. Il a une rétention de source, il n'est donc pas visible pour les bogues.
Philip Aston