问题标签 [checker-framework]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1087 浏览

java - @Retention Java 类型检查器注解

Java 8 类型注释 (JSR 308) 允许类型检查器执行静态代码分析。例如,检查器框架可以通过注释检查可能的空值。@NonNull

各种项目定义了自己的NonNull注解,例如:

  • org.checkerframework.checker.nullness.qual.NonNull
  • edu.umd.cs.findbugs.annotations.NonNull
  • javax.annotation.Nonnull
  • javax.validation.constraints.NotNull
  • lombok.NonNull
  • org.eclipse.jdt.annotation.NonNull
  • 等(参见Checker 框架手册,第 3.7 节

对于此类注释,我希望@interface具有@Retention(RetentionPolicy.CLASS),因为在运行时通常不需要它们。最重要的是,代码对各自的库没有任何运行时依赖项。

虽然org.eclipse.jdt.annotation.NonNull遵循这种方法,但大多数其他NonNull注释,如javax.annotation.Nonnull(JSR 305) 及其org.checkerframework.checker.nullness.qual.NonNull本身,都具有@Retention(RetentionPolicy.RUNTIME). RetentionPolicy.RUNTIME这些注释中有什么特别的原因吗?


澄清:Checker 框架支持注释中的注释以实现向后兼容性。然而,在 Java 8 中使用它们只是为了避免运行时依赖似乎是一种肮脏的 hack。

0 投票
1 回答
93 浏览

java - 如何修复 Checker Framework 错误 java:[contracts.precondition.not.satisfied] 对方法 'method()' 的无人看守的调用,要求持有 'Holding.yz'

如何正确调用method()from main(..)

错误:(37, 23) java: [contracts.precondition.not.satisfied] 对方法 'method()' 的无人看管的调用需要保持 'Holding.yz'

0 投票
1 回答
29 浏览

checker-framework - 如何调用副作用保证较弱的方法?

我从 Lock checker 那里得到了这个:

我可以发布代码,但没关系。我只是不了解有关调用副作用方法的文档。

0 投票
0 回答
156 浏览

java - 如何使用类型限定符和检查器框架实现微类型?

我是 Checker Framework 的新手,所以我可能做错了什么。

我想摆脱我们模型中的微类型,所以不要写

我想写一些类似的东西

因为所有的键都是字符串或者可以表示为字符串。

这样做的正确方法是什么?我正在阅读有关限定符层次结构和边界的文档,但所有这些似乎都过于复杂,我只是不了解基础知识。

我想要的是像@TypeAId、@TypeBId 等简单的注释,所以下面的代码应该会产生编译时错误:

更新 1:看起来我需要使用“子类型”,但我不明白如何编写子类型注释,因此将适用以下内容:

更新2:目前我有:

并得到:

0 投票
1 回答
326 浏览

java - Java collect 方法与 Checker 框架不兼容

我已将 Checker Framework v2.1.6 引入 java8 项目并修复了所有空值错误,但遇到以下错误

以下(简化)示例代码引发错误

现在我可以通过使结果@Nullable 来解决这个问题

但这只会将错误级联到下一个调用,现在认为 collectStrings 是可疑的

有没有人可以解决这个问题?

0 投票
1 回答
102 浏览

java - Checker Framework Eclipse 插件在加载时抛出异常

我安装了 Eclipse 4.6.2 和插件“Checker Framework Feature”2.1.7。

首次使用插件时(例如,当我右键单击并将鼠标悬停在上下文菜单项“Checker Framework/Run Built-in Checker”上)时,eclipse 错误日志中会出现以下错误:

SignednessAction 类的大写/小写似乎有问题...

任何人都可以帮忙吗?我很想使用 Checker 框架!

非常感谢!

0 投票
1 回答
237 浏览

java - 使用流 api 从 Stream<@Nullable T> 转换为 Stream<@NonNull T>

我使用 CheckerFramework

如何从 Stream 中删除空值并收集 @NonNull 对象?

0 投票
1 回答
251 浏览

checker-framework - 如何在 Checker FrameWork 中显示完整的编译错误消息信息以及行号等

我刚开始使用 Checker Framework,并且遇到了一个问题,该问题完全可以在该框架作者的示例项目之一上重现。该项目可在此处获得: https ://github.com/typetools/checker-framework/tree/master/docs/examples/GradleExamples

当我从 root 运行此命令时:

我收到这个编译输出:

如您所见,没有任何关于错误发生位置的信息,如类名、代码中的行号等。我在他们的官方手册中没有找到任何关于任何可以适当更改输出格式的编译器参数的信息。我希望错误消息如下所示:


更新:

我在 3 台机器上实现了这种行为:

    • 操作系统:Microsoft Windows 7 x64 Ultimate SP1 [版本 6.1.7601];
    • 爪哇:1.8.0_73;
    • 梯度:2.14。
    • 操作系统:Microsoft Windows 10 x64 Pro [版本 10.0.14393];
    • 爪哇:1.8.0_121;
    • 摇篮:3.4.1。
    • 操作系统:Microsoft Windows 7 x64 Ultimate SP1 [版本 6.1.7601];
    • 爪哇:1.8.0_121;
    • 摇篮:3.4.1。

只有在使用 Gradle 运行时才会出现行号和类名的缺失。我还尝试使用 Maven 和 Javac 从命令行运行检查器,它运行良好。
要使用 Gradle 配置 Checker Framework,我按照手册中的步骤操作。有3个步骤:

  1. 下载框架;
  2. 解压后创建一个 checker-framework 目录;
  3. 将 Gradle 配置为在类路径中包含 Checker Framework。

据我了解,Gradle 在通过依赖管理提供所需的 Checker Framework 的 jar 时会自动执行第 1 步和第 2 步。尽管如此,我尝试了两种选择:

  1. 依赖管理:
    我只是下载了示例项目并从 GradleJava7Example 项目的根目录执行“gradle compileJava”。
  2. 在 gradle 构建文件中手动编写路径:
0 投票
1 回答
426 浏览

java-8 - 在 FunctionalInterface lambda 中处理 @Nullable

我应该如何使用检查器框架类型的注释处理 lambda 函数?

例如,

Checker 将argument.type.incompatible在线路呼叫上发出警告runDispatch,即使layer事先正在检查。我知道 lambda 函数位于不同的上下文中,因此 Checker 无法正确评估它。处理它的最佳方法是什么?

额外信息

完整警告:

runDispatch在同一个类上声明,签名private void runDispatch(Progress progress, Load request, Layer layer)

另一个例子: 在我的代码的其他地方我有类似的情况,但涉及方法行为:

Item.class

在一个单独的班级:

在这里,在 Runnable 行我得到error: [contracts.precondition.not.satisfied] the called method 'buildExtraActionRunnable(layer, item, deliver)' has a precondition 'item.extraAction' that is not satisfied

0 投票
1 回答
615 浏览

java - NullnessChecker:如何仅禁用初始化检查器?

我参考了文档中的空值示例(检查器框架版本2.1.14:)

当我按照建议运行示例以检查NullnessExampleWithWarnings.java 时

我得到预期的错误:

现在我禁用初始化检查器:使用AsuppressWarnings=initialization.

但这也禁用了空检查,并且构建不再报告错误。

如何禁用Initialization checker,但保留 Null 检查?