uber/NullAway
GitHub: uber/NullAway
NullAway 是 Uber 开源的 Java 静态分析工具,通过注解在编译期检测潜在的空指针异常。
Stars: 4043 | Forks: 336
## NullAway:Java 快速基于注解的空值检查 [](https://github.com/uber/nullaway/actions/workflows/continuous-integration.yml) [](https://codecov.io/github/uber/NullAway?branch=master)
NullAway 是一个帮助消除 Java 代码中 `NullPointerException`(NPE)的工具。要使用 NullAway,首先在代码中任何字段、方法参数或返回值可能为 `null` 的地方添加 `@Nullable` 注解。根据这些注解,NullAway 执行一系列基于类型的本地检查,以确保代码中取消引用的任何指针不可能为 `null`。NullAway 类似于 Kotlin 和 Swift 语言中的基于类型的可空性检查,以及 Java 的 [Checker Framework](https://checkerframework.org/) 和 [Eradicate](https://fbinfer.com/docs/1.1.0/checker-eradicate/) 空值检查器。
NullAway 是*快速*的。它是作为 [Error Prone](http://errorprone.info/) 的插件构建的,可以在您的代码的每次构建中运行。根据我们的测量,运行 NullAway 的构建时间开销通常小于 10%。NullAway 也是*实用*的:它不能阻止代码中所有可能的 NPE,但它能捕获我们在生产环境中观察到的大多数 NPE,同时只需承担合理的注解工作量,带来极高的性价比。
## 安装
### 概述
NullAway 要求使用 JDK 17 或更高版本以及 [Error Prone](http://errorprone.info)(2.36.0 或更高版本)构建代码。请参阅 [Error Prone 文档](http://errorprone.info/docs/installation) 了解 Error Prone 入门和与构建系统集成的说明。以下说明假设您使用的是 Gradle;有关其他构建系统的讨论,请参阅[文档](https://github.com/uber/NullAway/wiki/Configuration#other-build-systems)。如果您在启用 JSpecify 模式下构建,我们建议使用最新的 JDK;有关更多详细信息,请参阅[wiki 文档关于 JSpecify 支持]("
}
dependencies {
errorprone "com.uber.nullaway:nullaway:"
// Some source of nullability annotations; JSpecify recommended,
// but others supported as well.
api "org.jspecify:jspecify:1.0.0"
errorprone "com.google.errorprone:error_prone_core:"
}
import net.ltgt.gradle.errorprone.CheckSeverity
tasks.withType(JavaCompile) {
options.errorprone {
check("NullAway", CheckSeverity.ERROR)
option("NullAway:AnnotatedPackages", "com.uber")
}
// Include to disable NullAway on test code
if (name.toLowerCase().contains("test")) {
options.errorprone {
disable("NullAway")
}
}
}
```
让我们逐步解释这个脚本。`plugins` 部分引入了 [Gradle Error Prone 插件](https://github.com/tbroyer/gradle-errorprone-plugin) 以集成 Error Prone。
在 `dependencies` 中,第一行 `errorprone` 加载 NullAway,`api` 行加载 [JSpecify](https://jspecify.dev) 库,它提供了合适的可空性注解,例如 `org.jspecify.annotations.Nullable`。NullAway 允许使用任何 `@Nullable` 注解,因此来自 AndroidX 注解库或 JetBrains 注解的 `@Nullable` 也可以。第二行 `errorprone` 设置所使用的 Error Prone 版本。
最后,在 `tasks.withType(JavaCompile)` 部分,我们向 NullAway 传递一些配置选项。首先 `check("NullAway", CheckSeverity.ERROR)` 将 NullAway 问题设置为错误级别(相当于标准的 Error Prone 参数 `-Xep:NullAway:ERROR`);默认情况下 NullAway 会发出警告。然后,`option("NullAway:AnnotatedPackages", "com.uber")`(相当于标准的 Error Prone 参数 `-XepOpt:NullAway:AnnotatedPackages=com.uber`)告诉 NullAway 应该检查 `com.uber` 命名空间下包中的源代码是否存在空值取消引用和正确使用 `@Nullable` 注解,并假设这些包中的类文件正确使用了 `@Nullable`(请参阅[文档](
标签:Android开发, Checker Framework, Error Prone, Gradle, JS文件枚举, Kotlin, NPE防护, NullPointerException, Swift, Uber开源, 云安全监控, 后台面板检测, 域名枚举, 构建工具插件, 注解驱动, 漏洞测试, 空值安全, 空值检查, 类型检查, 编译时检查, 静态分析