¿Hay alguna manera de ignorar una advertencia de FindBugs?


194

Con PMD, si desea ignorar una advertencia específica, puede usar // NOPMDpara que se ignore esa línea.

¿Hay algo similar para FindBugs?

Respuestas:


308

El enfoque inicial de FindBugs involucra archivos de configuración XML, también conocidos como filtros . Esto es realmente menos conveniente que la solución PMD, pero FindBugs funciona en bytecode, no en el código fuente, por lo que los comentarios obviamente no son una opción. Ejemplo:

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

Sin embargo, para resolver este problema, FindBugs más tarde introdujo otra solución basada en anotaciones (ver SuppressFBWarnings) que puede usar en la clase o en el nivel de método (en mi opinión, más conveniente que XML). Ejemplo (quizás no sea el mejor pero, bueno, es solo un ejemplo):

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

Tenga en cuenta que desde FindBugs 3.0.0 SuppressWarningsha quedado en desuso @SuppressFBWarningsdebido al choque de nombres con Java SuppressWarnings.


44
Pregunta adicional: ¿Cómo encuentro el valor apropiado para un "error" reportado dado (usando el sonar)?
PlanBForOpenOffice

29
El problema, por supuesto, con el uso del enfoque de anotación es que su código importa innecesariamente (y la dependencia posterior) la biblioteca Findbugs :(
Ashley Walton

9
@AshleyWalton, la retención de las anotaciones es CLASE, por lo que al menos es solo una dependencia del tiempo de compilación
earcam

17
Para esos usuarios de Maven, puede usar lo siguiente para importar las anotaciones. (Bonificación, el alcance se establece para que su proyecto no dependa de FindBugs en tiempo de ejecución). <dependency> <groupId>net.sourceforge.findbugs</groupId> <artifactId>annotations</artifactId> <version>1.3.2</version> <scope>provided</scope> </dependency>
bramp

77
Los usuarios de Maven deben agregar <dependency><groupId>com.google.code.findbugs</groupId><artifactId>annotations</artifactId><version>3.0.0</version><scope>provided</scope></dependency>a su POM si quieren usar @SuppressFBWarnings.
jansohn

22

Como otros mencionaron, puede usar la @SuppressFBWarningsanotación. Si no desea o no puede agregar otra dependencia a su código, puede agregar la anotación a su código usted mismo, a Findbugs no le importa en qué paquete se encuentre la anotación.

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

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


15

Aquí hay un ejemplo más completo de un filtro XML (el ejemplo anterior por sí solo no funcionará ya que solo muestra un fragmento y le faltan las <FindBugsFilter>etiquetas de inicio y fin):

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

Si está utilizando el complemento FindBugs de Android Studio, busque su archivo de filtro XML usando Archivo-> Otras configuraciones-> Configuración predeterminada-> Otras configuraciones-> FindBugs-IDEA-> Filtro-> Excluir archivos de filtro-> Agregar.


10

Actualizar Gradle

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

Busque el informe FindBugs

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

Encuentra el mensaje específico

encontrar errores

Importe la versión correcta de la anotación

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

Agregue la anotación directamente encima del código ofensivo

@SuppressWarnings("OUT_OF_RANGE_ARRAY_INDEX")

Consulte aquí para obtener más información: findbugs Spring Annotation


1
En su lugar, puede usar la compile 'net.sourceforge.findbugs:annotations:1.3.2'sintaxis, que es más corta.
kosiara - Bartosz Kosarzycki

3
+1, pero actualice amablemente su respuesta con: gradle testCompile 'com.google.code.findbugs:annotations:3.0.0'y nombre de anotación@SuppressFBWarnings
Vlad.Bachurin

8

Al momento de escribir esto (mayo de 2018), FindBugs parece haber sido reemplazado por SpotBugs . El uso de la SuppressFBWarningsanotación requiere que su código se compile con Java 8 o posterior e introduce una dependencia de tiempo de compilación spotbugs-annotations.jar.

Usar un archivo de filtro para filtrar las reglas de SpotBugs no tiene tales problemas. La documentación está aquí .


Su enlace a SpotBugs parece ser incorrecto. Lo encontré en spotbugs.github.io en su lugar.
Amedee Van Gasse

1

Si bien otras respuestas aquí son válidas, no son una receta completa para resolver esto.

En el espíritu de integridad:

Debe tener las anotaciones de findbugs en su archivo pom: solo son tiempo de compilación, por lo que puede usar el providedalcance:

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

Esto permite el uso de @SuppressFBWarningsotra dependencia que proporciona @SuppressWarnings. Sin embargo, lo anterior es más claro.

Luego agrega la anotación sobre su método:

P.ej

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

Esto incluye tanto el nombre del error como también una razón por la que deshabilita el escaneo.


-6

Voy a dejar este aquí: https://stackoverflow.com/a/14509697/1356953

Tenga en cuenta que esto funciona java.lang.SuppressWarningsasí que no es necesario utilizar una anotación separada.

@SuppressWarnings en un campo solo suprime las advertencias de findbugs informadas para esa declaración de campo, no todas las advertencias asociadas con ese campo.

Por ejemplo, esto suprime la advertencia "El campo solo se establece en nulo":

@SuppressWarnings ("UWF_NULL_FIELD") Cadena s = nulo; Creo que lo mejor que puedes hacer es aislar el código con la advertencia en el método más pequeño que puedas, luego suprimir la advertencia en todo el método.


8
java.lang.SuppressWarningsNo puedo trabajar. Tiene retención de fuente, por lo que no es visible para encontrar errores.
Philip Aston
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.