liquid-java/liquidjava

GitHub: liquid-java/liquidjava

一个基于 liquid types 和 typestates 的 Java 精化类型检查器,在编译时通过 SMT 求解器验证程序员定义的逻辑约束,提前捕获隐含的代码缺陷。

Stars: 58 | Forks: 35

# LiquidJava - 使用 Liquid Types 扩展 Java [![VS Code 扩展](https://img.shields.io/visual-studio-marketplace/v/AlcidesFonseca.liquid-java?label=VS%20Code&logo=visual-studio-code)](https://marketplace.visualstudio.com/items?itemName=AlcidesFonseca.liquid-java) [![Maven Central](https://img.shields.io/maven-central/v/io.github.liquid-java/liquidjava-api)](https://central.sonatype.com/artifact/io.github.liquid-java/liquidjava-api) ![LiquidJava Banner](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/e052fbeb4b115051.gif) ## 欢迎使用 LiquidJava! LiquidJava 是一个针对 Java 的附加类型检查器,基于 **liquid types** 和 **typestates**,通过编译时的 **refinements** 为 Java 程序提供额外的安全保障。 **示例:** ``` @Refinement("a > 0") int a = 3; // okay a = -8; // type error! ``` 本项目包含 LiquidJava 验证器及其 API,以及一些用于测试的示例。 您可以通过以下资源了解更多关于 LiquidJava 的信息: * [LiquidJava 网站](https://liquid-java.github.io) * [VS Code 扩展 (Marketplace)](https://marketplace.visualstudio.com/items?itemName=AlcidesFonseca.liquid-java) * [VS Code 扩展 (源代码)](https://github.com/liquid-java/vscode-liquidjava) * [LiquidJava 示例](https://github.com/liquid-java/liquidjava-examples) * [LiquidJava 外部库示例](https://github.com/liquid-java/liquid-java-external-libs) ## 快速入门 ### VS Code 扩展 使用 LiquidJava 最简单的方法是通过其 [VS Code 扩展](https://marketplace.visualstudio.com/items?itemName=AlcidesFonseca.liquid-java),该扩展直接在 VS Code 内部使用 LiquidJava 验证器,提供实时的错误诊断和 refinements 的语法高亮。 ### 命令行 在开发时,您可以从命令行使用 LiquidJava 验证器。 #### 前置条件 在设置 LiquidJava 之前,请确保您已安装以下软件: - Java 20+ - 用于编译和运行 Java 程序的 JDK - Maven 3.6+ - 用于构建和依赖管理 此外,您还需要以下依赖项,其中包含了 LiquidJava API 注解: #### Maven ``` io.github.liquid-java liquidjava-api 0.0.5 ``` #### Gradle ``` repositories { mavenCentral() } dependencies { implementation 'io.github.liquid-java:liquidjava-api:0.0.5' } ``` #### 安装说明 1. 克隆仓库:`git clone https://github.com/liquid-java/liquidjava.git` 2. 构建项目:`mvn clean install` 3. 运行测试以验证安装:`mvn test` 4. 如果导入到 IDE 中,请使用根目录的 `pom.xml` 将项目作为 Maven 项目导入 #### 运行验证 要运行 LiquidJava,请使用下面的 Maven 命令,将 `/path/to/your/project` 替换为您要验证的 Java 文件或目录的路径。 ``` mvn exec:java -pl liquidjava-verifier -Dexec.mainClass="liquidjava.api.CommandLineLauncher" -Dexec.args="/path/to/your/project" ``` 如果您使用的是 Linux/macOS,可以使用 `liquidjava` 脚本(位于仓库根目录)来简化此过程。 **测试正确用例**: ``` ./liquidjava liquidjava-example/src/main/java/testSuite/CorrectSimpleAssignment.java ``` 这应该会输出:`Correct! Passed Verification`。 **测试错误用例**: ``` ./liquidjava liquidjava-example/src/main/java/testSuite/ErrorSimpleAssignment.java ``` 这应该会输出一条描述 refinement 违规的错误信息。 #### 测试 运行 `mvn test` 以执行 LiquidJava 中的所有测试。 初始测试文件是 `TestExamples.java`,它会运行 `liquidjava-example` 下 `testSuite` 目录中的测试套件。 测试套件涵盖以下测试用例: 1. 以 `Correct` 或 `Error` 开头的文件(例如,`CorrectRecursion.java`) 2. 包含单词 `correct` 或 `error` 的目录(例如,`arraylist_correct`) 因此,不遵循此模式的文件和文件夹将被忽略。 对于失败的测试用例,必须按以下方式指定期望的错误: 1. 在单个测试文件中,期望的错误(标题)应作为注释写在文件的第一行 2. 在测试目录中,该目录中应包含一个带有期望错误(标题)的 `.expected` 文件 ## 项目结构 * **docs**:包含用于语言设计的文档。此文件夹包含一个 [README](./docs/design/README.md),其中包含指向设计过程中使用的完整工件的链接。它还包含在评估期间用于准备 refinements 语言设计的初始文档 * **liquidjava-api**:包含可以在 Java 程序中引入以添加 refinements 的注解 * **liquidjava-example**:包含一些示例和用于测试验证器的测试套件 * **liquidjava-verifier**:包含验证器的实现。其主要包有: * `api`:包含 `CommandLineLauncher`,用于对给定类运行验证,或者在未提供参数时对 `currentlyTesting` 目录运行验证 * `ast`:表示 Refinements Language (RJ) 的抽象语法树 (AST) * `errors`:用于报告错误的包 * `processor`:处理类型检查的包 * `rj_language`:处理将 refinement 字符串解析为 AST 的包 * `smt`:处理向 SMT solver 转换以及处理 SMT solver 生成的结果的包 * `utils`:包含上述所有包的有用方法 * `test/java/liquidjava/api/tests`:包含用于运行测试套件的 `TestExamples` 类
标签:Liquid Types, Maven, SMT求解器, Typestates, 云安全监控, 代码安全, 可配置连接, 域名枚举, 形式化验证, 漏洞枚举, 漏洞预防, 漏洞验证, 程序分析, 类型检查器, 类型状态, 精化类型, 编译器插件, 编译期检查, 静态分析