使用Bazel运行Checker框架

时间:2018-02-01 04:24:12

标签: bazel checker-framework

考虑一下这个github存储库。 https://github.com/dfabulich/bazel-checker-framework-bug

它包含一个明显违反X.java注释规则的示例@Nonnull文件。

import javax.annotation.Nonnull;
public class X {
    public static void main(String[] args) {
        new X().exec();
    }

    public void exec() {
        System.out.println(this.method());
    }

    @Nonnull
    private String method() {
        return null;
    }
}

WORKSPACE文件只包含checker.jar

maven_jar(
    name="checker",
    artifact="org.checkerframework:checker:2.3.1"
)

BUILD文件使用配置为java_plugin的检查器框架调用编译器。

java_library(
    name='x',
    srcs=['X.java'],
    deps=['@checker//jar'],
    plugins=['checker'],
)

java_plugin(
    name='checker',
    deps=['@checker//jar'],
    processor_class='org.checkerframework.checker.nullness.NullnessChecker',
)

当我bazel build x时,构建失败并显示以下错误:

  

错误:调用类org.checkerframework.checker.nullness.KeyForAnnotatedTypeFactory的构造函数时的InvocationTargetException;潜在原因:java.lang.StackOverflowError; Checker Framework崩溃了。请报告崩溃。要查看完整堆栈跟踪,请使用-AprintErrorStack

调用编译器

当我在plugins文件中注释掉BUILD行时,构建成功且没有错误。 (这是有道理的,但我最终希望Checker Framework在return.type.incompatible错误的情况下使这个版本失败。)

我在这里弄错了吗?这是Bazel的一个错误吗?

1 个答案:

答案 0 :(得分:3)

我在bazel-discuss mailing list上得到了一个很好的答案,告诉我尝试NullAway,这是一个依赖于Checker Framework的Error Prone插件。

github repo现在包含一个使用NullAway的工作示例,就像这样。

WORKSPACE:

maven_jar(
    name='jsr305',
    artifact='com.google.code.findbugs:jsr305:3.0.2',
)

maven_jar(
    name="nullaway",
    artifact="com.uber.nullaway:nullaway:0.3.2"
)

maven_jar(
    name="guava",
    artifact="com.google.guava:guava:22.0",
)

BUILD:

java_library(
    name='x',
    srcs=['X.java'],
    deps=['@jsr305//jar'],
    plugins=['nullaway'],
    javacopts=[
        '-Xep:NullAway:ERROR',
        '-XepOpt:NullAway:AnnotatedPackages=com.example',
    ],
)

java_plugin(
    name='nullaway',
    deps=[
        '@nullaway//jar',
        '@guava//jar',
    ],
)

(对番石榴的依赖是不幸的;它是必需的,因为without Guava, NullAway refuses to load。)