Existe uma maneira de ignorar um único aviso de FindBugs?

194

Com o PMD, se você deseja ignorar um aviso específico, pode usar // NOPMDpara que essa linha seja ignorada.

Existe algo semelhante para o FindBugs?

Ben S
fonte

Respostas:

308

A abordagem inicial do FindBugs envolve arquivos de configuração XML, também conhecidos como filtros . Isso é realmente menos conveniente do que a solução PMD, mas o FindBugs funciona no bytecode, não no código fonte, portanto, os comentários obviamente não são uma opção. Exemplo:

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

No entanto, para resolver esse problema, o FindBugs mais tarde introduziu outra solução baseada em anotações (consulte SuppressFBWarnings) que você pode usar na classe ou no nível do método (mais conveniente que XML na minha opinião). Exemplo (talvez não seja o melhor, mas, bem, é apenas um exemplo):

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

Observe que, desde que o FindBugs 3.0.0 SuppressWarningsfoi preterido em favor do @SuppressFBWarningspor causa do conflito de nome com o Java SuppressWarnings.

Pascal Thivent
fonte
4
Pergunta sobre bônus: Como encontro o valor apropriado para um determinado "bug" relatado (usando o sonar)?
PlanBForOpenOffice
29
O problema, naturalmente com o uso da abordagem anotação é que seu código em vez desnecessariamente as importações (e dependência posterior) da biblioteca Findbugs :(
Ashley Walton
9
@AshleyWalton retenção dos anotações são de classe, assim pelo menos é apenas uma dependência tempo de compilação
earcam
17
Para esses usuários do Maven, você pode usar o seguinte para importar as anotações. (Bônus, o escopo é definido para que seu projeto não dependa de FindBugs em tempo de execução). <dependency> <groupId>net.sourceforge.findbugs</groupId> <artifactId>annotations</artifactId> <version>1.3.2</version> <scope>provided</scope> </dependency>
Br
7
Os usuários do Maven devem adicionar <dependency><groupId>com.google.code.findbugs</groupId><artifactId>annotations</artifactId><version>3.0.0</version><scope>provided</scope></dependency>ao POM, se quiserem usar @SuppressFBWarnings.
jansohn
22

Como outros mencionados, você pode usar a @SuppressFBWarningsanotação. Se você não deseja ou não pode adicionar outra Dependência ao seu código, você pode adicionar a Anotação ao seu Código, o Findbugs não se importa em qual Pacote a Anotação está.

@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

hinneLinks
fonte
15

Aqui está um exemplo mais completo de um filtro XML (o exemplo acima por si só não funcionará, pois mostra apenas um trecho e faltam as <FindBugsFilter>tags de início e fim):

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

Se você estiver usando o plug-in Android Studio FindBugs, navegue até o arquivo de filtro XML usando Arquivo-> Outras configurações-> Configurações padrão-> Outras configurações-> FindBugs-IDEA-> Filtro-> Excluir arquivos de filtro-> Adicionar.

mbonness
fonte
10

Update Gradle

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

Localize o relatório FindBugs

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

Encontre a mensagem específica

encontrar bugs

Importar a versão correta da anotação

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

Adicione a anotação diretamente acima do código incorreto

@SuppressWarnings("OUT_OF_RANGE_ARRAY_INDEX")

Veja aqui para mais informações: findbugs Spring Annotation

anataliocs
fonte
1
Você pode usar a compile 'net.sourceforge.findbugs:annotations:1.3.2'sintaxe, que é mais curta.
Kosiara # Bartosz Kosarzycki 11/11
3
+1, mas atualize sua resposta com: testCompile 'com.google.code.findbugs:annotations:3.0.0'nome da nota e da anotação@SuppressFBWarnings
Vlad.Bachurin 26/17/17
8

No momento em que escrevemos isso (maio de 2018), o FindBugs parece ter sido substituído pelo SpotBugs . O uso da SuppressFBWarningsanotação requer que seu código seja compilado com o Java 8 ou posterior e introduz uma dependência no tempo de compilação spotbugs-annotations.jar.

O uso de um arquivo de filtro para filtrar regras do SpotBugs não apresenta esses problemas. A documentação está aqui .

Steve
fonte
Seu link para o SpotBugs parece estar incorreto. Eu o encontrei em spotbugs.github.io .
Amedee Van Gasse
1

Embora outras respostas aqui sejam válidas, elas não são uma receita completa para resolver isso.

No espírito de perfeição:

Você precisa ter as anotações findbugs no seu arquivo pom - elas são apenas tempo de compilação, para que você possa usar o providedescopo:

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

Isso permite o uso de @SuppressFBWarningsoutra dependência que fornece @SuppressWarnings. No entanto, o acima exposto é mais claro.

Em seguida, adicione a anotação acima do seu método:

Por exemplo

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

Isso inclui o nome do bug e também uma razão pela qual você está desativando a verificação.

Ashley Frieze
fonte
-6

Vou deixar este aqui: https://stackoverflow.com/a/14509697/1356953

Observe que isso funciona, java.lang.SuppressWarningsportanto, não é necessário usar uma anotação separada.

@SuppressWarnings em um campo suprime apenas os avisos de erros encontrados para essa declaração de campo, nem todos os avisos associados a esse campo.

Por exemplo, isso suprime o aviso "O campo é definido apenas como nulo":

@SuppressWarnings ("UWF_NULL_FIELD") String s = nulo; Acho que o melhor que você pode fazer é isolar o código com o aviso no menor método possível e suprimir o aviso em todo o método.

00500005
fonte
8
java.lang.SuppressWarningsnão pode trabalhar Possui retenção de origem, portanto não é visível para encontrar erros.
Philip Aston