29

我想禁止针对特定字段或局部变量的 FindBugs 警告。FindBugs 文档中的Target, Type, Field, Method, Parameter,Constructor为其Package注解edu.umd.cs.findbugs.annotations.SuppressWarning[1]。但是注释字段对我不起作用,只有当我注释方法时,警告才会被抑制。

注释整个方法对我来说似乎很广泛。有没有办法抑制特定字段的警告?还有另一个相关的问题[2],但没有答案。

[1] http://findbugs.sourceforge.net/manual/annotations.html

[2]抑制 Eclipse 中的 FindBugs 警告

演示代码:

public class SyncOnBoxed
{
    static int counter = 0;
    // The following SuppressWarnings does NOT prevent the FindBugs warning
    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="DL_SYNCHRONIZATION_ON_BOXED_PRIMITIVE")
    final static Long expiringLock = new Long(System.currentTimeMillis() + 10);
    
    public static void main(String[] args) {
        while (increment(expiringLock)) {
            System.out.println(counter);
        }
    }
    
    // The following SuppressWarnings prevents the FindBugs warning
    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="DL_SYNCHRONIZATION_ON_BOXED_PRIMITIVE")
    protected static boolean increment(Long expiringLock)
    {
        synchronized (expiringLock) { // <<< FindBugs warning is here: Synchronization on Long in SyncOnBoxed.increment()
            counter++;
        }
        return expiringLock > System.currentTimeMillis(); // return false when lock is expired
    }
}
4

2 回答 2

32

@SuppressFBWarningson a field 仅抑制为该字段声明报告的 findbugs 警告,而不是与该字段关联的每个警告。

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

@SuppressFBWarnings("UWF_NULL_FIELD")
String s = null;

我认为您能做的最好的事情就是将带有警告的代码隔离成最小的方法,然后抑制整个方法的警告。

注意:@SuppressWarnings被标记为弃用,以支持@SuppressFBWarnings

于 2013-01-24T20:01:14.467 回答
3

检查http://findbugs.sourceforge.net/manual/filter.html#d0e2318 有一个可以与 Method 标签一起使用的 Local 标签。您可以在此处指定应为特定局部变量排除哪个错误。例子:

<FindBugsFilter>
  <Match>
        <Class name="<fully-qualified-class-name>" />
        <Method name="<method-name>" />
        <Local name="<local-variable-name-in-above-method>" />
        <Bug pattern="DLS_DEAD_LOCAL_STORE" />
  </Match>
</FindBugsFilter>
于 2015-05-29T14:01:47.367 回答