问题标签 [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 投票
1 回答
211 浏览

java - Pluggable Type Checkers 和 Checkers 框架,真的需要所有这些设置吗?

我试图了解 Checker Framework 如何实现可插入类型检查器。通过阅读文档,

检查器框架 (Maven)

我看到涉及很多设置,在我看来要么已经过时,要么没有完全维护。

据我所知,Java 8 在 JSR-308 和 JSR-269 上支持类型注释和可插入类型检查器,允许接口在几乎每个元素上创建自定义注释,并使用带有简单标志的接口代码片段对其进行处理在 javac (-processor) 上,maven 支持通过META-INF/services/javax.annotation.processing.Processor

那么为什么文档指出 Checker 需要这么多的定制..?:

我认为自 Java 8 特性以来,Checker 框架实际上一直是自定义注释处理器的集合。是这样吗?似乎不再需要启用编译器、创建自定义检查 (JSR-269) 和启用/* @Nullable */等等......我很乐意纠正

0 投票
0 回答
179 浏览

java - 如何使用 Kotlin 反射获得 Java 类型的可空性?

当我使用 Kotlin 反射来获取Kotlin属性的可空性时,就像val nullableString: String?我在. 它也适用于“内部”类型,例如不仅整个列表可以为空,而且单个元素也可以为.isMarkedNullableKTypeval nullableList: List<String?>?null

我也想对Java类型使用相同的机制。它部分有效,例如当我有类似public @javax.annotation.Nullable String text;. 但@javax.annotation.Nullable不能这样使用,public List<@Nullable String> list;因为它没有TYPE_USE目标。所以我想使用@org.checkerframework.checker.nullness.qual.Nullable,但是 Kotlin 反射忽略了这个注释。

这是一些测试:

产生以下输出:

是否可以告诉 Kotlin 反射使用哪些注释?他们是否计划支持 Checker 框架?我会很感激任何评论。谢谢

0 投票
1 回答
1661 浏览

checker-framework - NullnessChecker 错误:java.lang.NoSuchFieldError:RELEASE

我不能再用检查器框架构建我的代码了。当我注释掉检查器框架注释处理器时,我的代码编译得很好,所以问题不在于我的代码。使用该框架,我收到以下错误消息:

(完整的堆栈跟踪位于底部。)

此堆栈跟踪没有引用我的代码中的任何内容。这似乎是空值检查器中的一个错误。

我正在使用当前版本的 maven (3.6.3) 和 maven 编译器插件 (3.8.1)。我正在使用 JDK 1.8。

要查看 pom.xml 文件和代码,请查看位于https://github.com/SwingGuy1024/CheckerNoSuchFieldErrorBug的存储库 这是 pom 文件的链接:https ://github.com/SwingGuy1024/CheckerNoSuchFieldErrorBug/blob/master /pom.xml

要使用 Maven 重现错误,请下载存储库并键入mvn clean install

这是完整的堆栈跟踪:

0 投票
1 回答
115 浏览

java - Checkerframework 替换注解

我是 Checker Framework 的新手,我已经定义了 2 个子类型注释,如下所示:

当我在以下代码上使用带有这些注释的子类型检查器时,它会产生错误,因为 sink() 需要一个标记为 @Sub 的字符串,但接收到 @Base(String s0 的默认值),这是预期的行为。

现在我想添加第三个注释,例如称为 @ToSub 并像这样使用它:

这第三个注释应该将当前类型的 s0 (@Base) 转换为新字符串 s1 的子类型 @Sub,以便此代码示例不会引发错误。

使用 Checker Framework 是否有可能?我无法通过定义一个新的注释来完成这个任务,我错过了什么吗?这只能通过编写一个全新的检查器来完成吗?

0 投票
1 回答
109 浏览

java - 如何在存根中注释隐式参数

我正在尝试使用 Nullness Checker 来构建 JPanel 的子类。

错误消息说:

问题似乎是 add 方法假定this已初始化。但是在构造函数中调用 Container 的 add 方法是非常安全的。所以为了防止这个错误,我想创建一个带有带注释的隐式参数的存根文件:

它似乎没有将add()这里的方法识别为java.awt.Container.add(Component, Object)方法。

这是完整的存根文件:

我知道我可以使用注释来抑制警告,但存根文件感觉像是一种更简洁的方法。有没有办法修复这个存根文件?

0 投票
1 回答
188 浏览

maven-compiler-plugin - 为生成的代码排除 NullnessChecker 注释处理器

我正在将 Nullness Checker 从检查器框架集成到我们使用 Maven 构建的 Java 项目中。maven-compiler-plugin我为插件配置了注释处理器。一切正常,除了我不希望它通过生成的代码运行。

排除对target目录中的代码或特定 java 包使用这些注释处理器可能会有所帮助,但我不知道该怎么做。

我还尝试为 Nullness Checker 本身查找配置以排除目录或 java 包。我再次找不到任何东西。

这是我的插件配置:

0 投票
1 回答
189 浏览

java - 从 checkerframework 解决 Nullness 错误

我有一些 java 代码,如下所示

这给了我错误

这是无法理解的,getFoo因为它被装饰了Nullable

我可以在不修改bar方法的情况下防止这种情况吗?这两种方法getFoobar超出了我的控制范围,无法进行修改。解决此问题的解决方案是什么?

0 投票
1 回答
179 浏览

java - 类型参数中的检查器框架不兼容类型

我有一些这样的代码,我将映射存储到java threadlocal,

从 checkerframework 启用空值检查时,我得到

我不明白如何解决这个问题。

0 投票
1 回答
440 浏览

java - maven 编译器插件不通过编译器 J-Xbootclasspath/p args

-J-Xbootclasspath/p: 不是由 maven 编译器插件传递的,我该如何解决?

系统环境:jdk 1.8.0_265,windows 10.
maven 文件:我从 CheckerFramework 示例pom.xml复制它。

当我第一次通过 mvn clean compile 运行它时,它与

无法在项目 MavenExample 上执行目标 org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile)Example:编译失败

所以我运行 mvn clean compile -X 然后发现 -J-Xbootclasspath/p:/path/to/javac.jar 不包含在命令行选项中。
然后我在其中包含“-J-Xbootclasspath/p”并手动 javac 编译它,它成功了。但是我需要在maven中使用它,所以我问了这个问题。

这是打印的失败命令行选项

[调试]
-d D:\workproject\TestCheck\target\classes
-classpath D:\workproject\TestCheck\target\classes;C:\Users\张云.m2\repository\org\checkerframework\checker-qual\3.6。 1\checker-qual-3.6.1.jar;C:\Users\张云.m2\repository\com\google\errorprone\javac\9+181-r4173-1\javac-9+181-r4173-1。 jar;C:\Users\张云.m2\repository\org\apache\commons\commons-lang3\3.1\commons-lang3-3.1.jar;C:\Users\张云.m2\repository\javax\servlet\ servlet-api\2.4\servlet-api-2.4.jar;
-sourcepath D:\workproject\TestCheck\src\main\java;D:\workproject\TestCheck\target\generated-sources\annotations; D:\workproject\TestCheck\src\main\java\Main.java -s D:\workproject\TestCheck\target\generated-sources\annotations
-processor org.checkerframework.checker.nullness.NullnessChecker
-processorpath C:\Users\张云.m2\repository\org\checkerframework\checker\3.6.1\checker-3.6.1.jar;-g -verbose -target 1.8 -source 1.8 -encoding UTF-8 -Alint

这是完整的日志文件日志

项目文件

0 投票
1 回答
49 浏览

java - 如何使用 Checker 框架将 NNEL(非 Null 除局部变量)声明为 API 的默认值

过去的手册和 Stackoverflow 的答案都说 NNEL 是 Checker Framework 中的默认值。但是,最近的手册(3.7.1)不再提及该术语。

我在一个包裹上试过这个:

这行得通,但是,我不能声明:

结果是:

问题:

  • 现在默认是什么?
  • NNEL 概念是否包含类型参数?
  • 如何module-info.java以尽可能最短的形式为包或更多逻辑为 Java 模块 ( ) 建立 NNEL?
  • 如果 NEEL 不包含类型参数,我怎样才能 EntryProcessor<K, V, @Nullable R>有效地建立默认值EntryProcessor<@NonNull K, @NonNull V, @Nullable R>