如何为具有特定注释的字段设置查找虫过滤器?

2022-09-03 15:55:02

我有一个由FindBugs报告的错误,但我更了解:)请参阅以下示例:

public class MyClass extends BaseClass {

    @CustomInjection
    private Object someField;

    public MyClass() {
        super();
        someField.someMethod(); // Bug is here because FindsBugs thinks this is always null
    }
}

在我的 BaseClass 构造函数中,我为所有字段注入了带有正确对象@CustomInjection注释,因此在我的情况下,我的注释字段不为 null。

我不想用“抑制警告”来抑制警告,因为这会使代码变得混乱。我更喜欢制作一个像findbugs在这里解释的过滤器,但我不知道如何过滤用某个界面注释的字段的错误。我也不想过滤所有空错误警告。我认为它应该是这样的:

<Match>
  <Bug code="UR">  
  <Field annotation="CustomInjection">
</Match>

答案 1

我找到了解决此问题的解决方法。似乎基于注释的注入的检测在FindBugs中是硬编码的,请参阅以下源代码:

public static boolean isInjectionAttribute(@DottedClassName String annotationClass) {
    if (annotationClass.startsWith("javax.annotation.")
            || annotationClass.startsWith("javax.ejb")
            || annotationClass.equals("org.apache.tapestry5.annotations.Persist")
            || annotationClass.equals("org.jboss.seam.annotations.In")
            || annotationClass.startsWith("javax.persistence")
            || annotationClass.endsWith("SpringBean")
            || annotationClass.equals("com.google.inject.Inject")
            || annotationClass.startsWith("com.google.") && annotationClass.endsWith(".Bind")
            && annotationClass.hashCode() == -243168318
            || annotationClass.startsWith("org.nuxeo.common.xmap.annotation")
            || annotationClass.startsWith("com.google.gwt.uibinder.client")
            || annotationClass.startsWith("org.springframework.beans.factory.annotation")
            || annotationClass.equals("javax.ws.rs.core.Context")) {
        return true;
    }
    int lastDot = annotationClass.lastIndexOf('.');
    String lastPart = annotationClass.substring(lastDot + 1);
    if (lastPart.startsWith("Inject")) {
        return true;
    }
    return false;
}

因此,像这样的注释不会显示为UR错误,但我的注释将始终是UR错误。@EJB@CustomInjection

但是在函数的末尾,所有以“Inject”开头的注释名都有一个转义,所以如果我重命名为UR,bug就会消失。因此,要避免此问题,只需将注释重命名为 .@CustomInjection@InjectCustom@InjectSomething


答案 2

如果无法直接执行此操作,请编写一个预处理器来检测注释并生成代码,该代码使用可使其使用对 FindBugs 有效的内容初始化字段。将预处理器输出提供给 FindBugs,而不是原始源代码。


推荐