4

考虑这个 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',
)

当 Ibazel build x时,构建失败并出现以下错误:

错误:调用类 org.checkerframework.checker.nullness.KeyForAnnotatedTypeFactory 的构造函数时出现 InvocationTargetException;根本原因:java.lang.StackOverflowError;Checker 框架崩溃了。请报告崩溃。要查看完整的堆栈跟踪,请使用 -AprintErrorStack 调用编译器

当我注释掉文件中的plugins行时BUILD,构建成功且没有错误。(这是有道理的,但我最终希望 Checker 框架因return.type.incompatible错误而使此构建失败。)

我在这里犯错了吗?这是 Bazel 中的错误吗?

4

1 回答 1

3

我在bazel-discuss 邮件列表上得到了一个很好的答案,告诉我尝试NullAway,这是一个依赖于 Checker 框架的容易出错的插件。

github存储库现在包含一个使用 NullAway 的工作示例,如下所示。

工作空间:

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",
)

建造:

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',
    ],
)

(对番石榴的依赖是不幸的;它是必需的,因为没有番石榴,NullAway 拒绝加载。)

于 2018-02-02T23:05:16.960 回答