有没有办法忽略单个FindBugs警告?


Answers:


308

FindBugs的初始方法涉及XML配置文件(也称为过滤器)。这确实不如PMD解决方案方便,但是FindBugs只能在字节码上工作,而不能在源代码上工作,因此注释显然不是一个选择。例:

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

但是,为解决此问题,FindBugs稍后引入了另一个基于注释的解决方案(请参阅参考资料SuppressFBWarnings),您可以在类或方法级别使用它(在我看来比XML更方便)。示例(也许不是最好的示例,但是,这只是一个示例):

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

请注意,由于与Java的名称冲突SuppressWarnings@SuppressFBWarnings因此不建议使用FindBugs 3.0.0 SuppressWarnings


4
奖励问题:如何为给定的已报告“错误”(使用声纳)找到合适的值?
PlanBForOpenOffice 2011年

29
当然,使用注释方法的问题是您的代码会不必要地导入(和后续依赖项)Findbugs库:(
Ashley Walton

9
@AshleyWalton,注释的保留是CLASS,所以至少它只是一个编译时间依赖项
earcam

17
对于那些Maven用户,您可以使用以下内容导入注释。(奖金,设置了作用域,因此您的项目在运行时不依赖于FindBugs)。<dependency> <groupId>net.sourceforge.findbugs</groupId> <artifactId>annotations</artifactId> <version>1.3.2</version> <scope>provided</scope> </dependency>
凌晨

7
Maven用户<dependency><groupId>com.google.code.findbugs</groupId><artifactId>annotations</artifactId><version>3.0.0</version><scope>provided</scope></dependency>如果想使用,应该添加到他们的POM中@SuppressFBWarnings
jansohn

22

正如其他提及的那样,您可以使用@SuppressFBWarnings注释。如果您不希望或无法向代码中添加其他依赖项,则可以自己将注释添加到代码中,Findbugs不在乎注释在哪个Package中。

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

资料来源:https : //sourceforge.net/p/findbugs/feature-requests/298/#5e88


15

这是XML过滤器的一个更完整的示例(上面的示例本身不起作用,因为它仅显示了一个代码段,并且缺少<FindBugsFilter>begin和end标记):

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

如果您使用的是Android Studio FindBugs插件,请使用文件->其他设置->默认设置->其他设置-> FindBugs-IDEA->过滤器->排除过滤器文件->添加浏览到XML过滤器文件。


10

更新摇篮

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

找到FindBugs报告

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

查找特定的消息

发现错误

导入正确版本的注释

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

将注释直接添加到有问题的代码上方

@SuppressWarnings("OUT_OF_RANGE_ARRAY_INDEX")

参见更多信息:findbugs Spring Annotation


1
您可以改用compile 'net.sourceforge.findbugs:annotations:1.3.2'较短的语法。
kosiara-Bartosz Kosarzycki '16

3
+1,但请使用以下方式更新您的答案:gradle testCompile 'com.google.code.findbugs:annotations:3.0.0'和注释名称@SuppressFBWarnings
Vlad.Bachurin

8

在撰写本文时(2018年5月),FindBugs似乎已被SpotBugs取代。使用SuppressFBWarnings注释要求您的代码使用Java 8或更高版本进行编译,并引入对的编译时间依赖性spotbugs-annotations.jar

使用过滤器文件过滤SpotBugs规则没有这样的问题。文档在这里


您到SpotBugs的链接似乎不正确。我在spotbugs.github.io上找到了它。
Amedee Van Gasse

1

尽管此处的其他答案是有效的,但它们并不是解决此问题的完整方法。

本着完整性的精神:

您需要在pom文件中包含findbugs批注-它们只是编译时,因此您可以使用provided范围:

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

这允许使用@SuppressFBWarnings提供的另一个依赖项@SuppressWarnings。但是,以上内容更为清楚。

然后在方法上方添加注释:

例如

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

这不仅包括错误的名称,还包括您禁用其扫描的原因。


-6

我要在这里离开这个:https : //stackoverflow.com/a/14509697/1356953

请注意,这可以使用,java.lang.SuppressWarnings因此无需使用单独的注释。

字段上的@SuppressWarnings仅禁止报告针对该字段声明报告的findbugs警告,而不是与该字段关联的每个警告。

例如,这消除了“仅将字段设置为null”警告:

@SuppressWarnings(“ UWF_NULL_FIELD”)字符串s = null; 我认为您能做的最好的事情就是将带有警告的代码隔离到最小的方法中,然后在整个方法上取消警告。


8
java.lang.SuppressWarnings不能工作 它具有源保留,因此对findbugs不可见。
菲利普·阿斯顿
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.