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

Posted

技术标签:

【中文标题】有没有办法忽略单个 FindBugs 警告?【英文标题】:Is there a way to ignore a single FindBugs warning? 【发布时间】:2010-12-22 05:48:38 【问题描述】:

使用 PMD,如果您想忽略特定警告,可以使用 // NOPMD 忽略该行。

FindBugs 有类似的东西吗?

【问题讨论】:

【参考方案1】:

FindBugs 的初始方法涉及 XML 配置文件,也就是 filters。这确实不如 PMD 解决方案方便,但 FindBugs 适用于字节码,而不适用于源代码,因此 cmets 显然不是一个选项。示例:

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

但是,为了解决这个问题,FindBugs 后来推出了另一种基于annotations(参见SuppressFBWarnings)的解决方案,您可以在类或方法级别使用它(我认为比 XML 更方便)。示例(也许不是最好的,但是,这只是一个示例):

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

请注意,由于与 Java 的 SuppressWarnings 名称冲突,已弃用 FindBugs 3.0.0 SuppressWarnings 以支持 @SuppressFBWarnings

【讨论】:

额外问题:如何为给定报告的“错误”(使用声纳)找到合适的值? 使用注释方法的问题当然是您的代码不必要地导入(以及后续依赖)Findbugs 库:( @AshleyWalton 注释的保留是 CLASS,所以至少它只是一个编译时依赖 对于那些 Maven 用户,您可以使用以下方式导入注解。 (奖励,范围已设置,因此您的项目在运行时不依赖于 FindBugs)。 &lt;dependency&gt; &lt;groupId&gt;net.sourceforge.findbugs&lt;/groupId&gt; &lt;artifactId&gt;annotations&lt;/artifactId&gt; &lt;version&gt;1.3.2&lt;/version&gt; &lt;scope&gt;provided&lt;/scope&gt; &lt;/dependency&gt; Maven 用户如果想使用@SuppressFBWarnings,应该将&lt;dependency&gt;&lt;groupId&gt;com.google.code.findbugs&lt;/groupId&gt;&lt;artifactId&gt;annotations&lt;/artifactId&gt;&lt;version&gt;3.0.0&lt;/version&gt;&lt;scope&gt;provided&lt;/scope&gt;&lt;/dependency&gt; 添加到他们的POM 中。【参考方案2】:

正如其他人提到的,您可以使用@SuppressFBWarnings 注释。 如果你不想或不能在你的代码中添加另一个依赖,你可以自己在你的代码中添加注解,Findbugs 并不关心注解在哪个包中。

@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

【讨论】:

【参考方案3】:

这是一个更完整的 XML 过滤器示例(上面的示例本身不起作用,因为它只显示一个 sn-p 并且缺少 &lt;FindBugsFilter&gt; 开始和结束标记):

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

如果您使用的是 android Studio FindBugs 插件,请使用 File->Other Settings->Default Settings->Other Settings->FindBugs-IDEA->Filter->Exclude filter files->Add 浏览到您的 XML 过滤器文件。

【讨论】:

【参考方案4】:

更新 Gradle

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

找到 FindBugs 报告

file:///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

【讨论】:

您可以使用compile 'net.sourceforge.findbugs:annotations:1.3.2' 语法来代替,它更短。 +1,但请更新您的答案:gradle testCompile 'com.google.code.findbugs:annotations:3.0.0' 和注释名称 @SuppressFBWarnings【参考方案5】:

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

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

【讨论】:

您到 SpotBugs 的链接似乎不正确。我在spotbugs.github.io 找到了它。【参考方案6】:

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

本着完整的精神:

你需要在你的 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)))  ... 

这包括 bug 的名称以及您禁用扫描它的原因。

【讨论】:

【参考方案7】:

我要把这个留在这里:https://***.com/a/14509697/1356953

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

@SuppressWarnings 在字段上只抑制 findbugs 警告 报告该字段声明,而不是与相关的每个警告 那个字段。

例如,这会抑制“仅设置为空的字段” 警告:

@SuppressWarnings("UWF_NULL_FIELD") 字符串 s = null;我认为最好的 你可以做的是将带有警告的代码隔离成最小的 方法,然后抑制整个方法的警告。

【讨论】:

java.lang.SuppressWarnings 无法工作。它具有源代码保留,因此 findbugs 不可见。

以上是关于有没有办法忽略单个 FindBugs 警告?的主要内容,如果未能解决你的问题,请参考以下文章

Findbugs 警告:整数移位 32 - 这是啥意思?

有没有办法让 iOS 的自动更正忽略 UITextView 中的单个单词或正则表达式?

如何抑制字段或局部变量的 FindBugs 警告?

修复此“从实例方法写入静态字段”findbugs 警告的最佳方法是啥?

使用 LLVM/Clang 忽略特定文件中的所有警告

忽略 IB 中的模棱两可的布局警告