本文档整理了工业级形式化验证工具的全景对比,按重要程度排列分类维度,并给出三张核心对照表(能力矩阵、信任与合规、落地风险)以及各工具逐条说明。
判断标准:「工业验证过」指满足至少一条——① 被安全认证标准(DO-178C/ISO 26262/IEC 61508/CC EAL)认可并有鉴定包;② 在生产系统中长期运行且有公开事故/漏洞发现记录;③ 由商业公司持续维护并出售支持;④ 开源但有大厂 CI 常驻。
分类维度总览(按重要程度排列)
第一组:身份与定位(决定它能不能进候选池)
| # | 维度 | 取值示例 | 为什么重要 |
|---|
| 1 | 验证层位 | 设计/协议层 · 代码级演绎 · 代码级模型检验 · 编译链/二进制 · RTL/硬件 | 最关键的一栏。TLA+ 和 Verus 放一起比是无效的;必须先分层再比较。 |
| 2 | 输入语言/工件 | C / C++ / Rust / Ada / 自有语言 / 规约语言 / SystemVerilog / 二进制 | 直接决定能不能接你的代码库。Rust 侧目前实质只有 Verus + Kani + RAPx。 |
| 3 | 方法流派 | 交互式定理证明 · auto-active/SMT · 有界模型检验 · 抽象解释 · 符号执行 · 等价性检查 · 类型系统 | 决定人力结构:是要形式化专家,还是普通工程师能上手。 |
| 4 | 是否生成代码 | 是(提取)· 否(原位验证)· N/A(只做分析) | 对应「写几遍」问题。 |
第二组:能力与强度(决定它能证什么)
| # | 维度 | 取值 | 说明 |
|---|
| 5 | 结论强度 | 无界全称 · 有界全称(k 以内)· 无漏报有误报(过近似)· 有限状态全称 · 规则级 | 第二关键栏。必须和「层位」一起读:有限状态全称 ≠ 弱,它在协议层已经够用。 |
| 6 | 能证的性质类 | 内存安全 · 运行时错误/溢出 · 功能正确性 · 隔离/信息流 · 活性(liveness) · 时序/WCET · 恒定时间 · 等价性 | 单一「强度」栏会掩盖差异:Astrée 强度不低但只覆盖「运行时错误」;TLA+ 是唯一低成本能证活性的。 |
| 7 | 并发/多核能力 | 无 · 有界交错 · 模块化并发推理(ownership+不变式)· 活性 | 内核场景的生死栏。Rust 侧能做模块化并发推理的目前只有 Verus。 |
| 8 | unsafe/FFI/汇编处理 | 原生支持 · 需手工建模 · 完全不支持 | 做内核这一栏比「整体成熟度」更有区分度。 |
| 9 | 是否需要注解 | 零注解 · 轻量契约 · 大量契约+循环不变式 · 需专家手写引理 | 直接换算成人力成本。抽象解释赢在这里,SMT 路线输在这里。 |
| 10 | 规模上限 | 函数级 · 模块级 · 十万行级 · RTL 签核级 | Astrée 的 50 万行 vs Coq 的几千行核心模块,差两个数量级。 |
| 11 | 反例与调试支持 | 可执行反例+轨迹 · 可读 counterexample · 只有 unsat 证书 · 无 | 决定它是「找 bug 工具」还是「出证书工具」,也决定团队愿不愿意天天用。 |
第三组:信任与合规(决定结论能不能对外说)
| # | 维度 | 取值 | 说明 |
|---|
| 12 | 信任基干净度 | 小内核可独立检查 · 含已证编译器 · 依赖求解器(版本钉死)· 工具本身未验证 | seL4/CertiKOS 与普通 SMT 工具的分水岭。 |
| 13 | 编译链覆盖 | 已证编译器(CompCert)· 二进制级等价证明 · 假设编译器正确 | 99% 的项目在这一栏是空的,但对内核是硬缺口。 |
| 14 | 认证背书 | DO-178C A/B · ISO 26262 ASIL D · EN 50128 · CC EAL · 有鉴定包(TUV) | 若目标是过审而非数学保证,这一栏权重应高于「结论强度」。SPARK/PikeOS/Astrée/SCADE 在此领先。 |
| 15 | 证据形态 | 机器检查证明脚本 · 求解器日志 · 分析报告 · 认证材料包 | 决定审计时你能拿出什么。 |
第四组:工程落地(决定它能不能活过两年)
| # | 维度 | 取值 | 说明 |
|---|
| 16 | 工业案例与生产常驻 | 有公开长期案例 · CI 常驻 · 仅有论文/原型 · 已停更 | 「成熟度」应该用这一栏定义,而不是起始年份。Ironclad 强但停更,就要降级。 |
| 17 | 维护方与许可 | 商业公司+付费支持 · 大厂开源常驻 · 学术实验室 · 社区 | 决定十年后谁修 bug。CertiKOS 的问题就出在这里。 |
| 18 | 证明资产可持续性 | CI 自动回归 · 需人工重跑 · 版本钉死易腐化 | seL4 团队反复强调的最大运维成本。这栏常被忽略却最致命。 |
| 19 | 人才可得性/学习曲线 | 普通工程师数月可用 · 需专职形式化工程师 · 全球稀缺 | 直接决定你招不招得到人。Coq/Isabelle 在这栏最贵。 |
| 20 | 平台/架构支持 | x86 / AArch64 / RISC-V / 嵌入式 MCU / 无 | 内核选型硬约束。 |
| 21 | 集成方式 | CLI + CI · IDE/VSCode · 构建系统集成 · 独立工作台 | 影响日常摩擦成本。Quint/Verus 的 IDE 体验明显好于 TLAPS。 |
| 22 | 成本 | 许可证费用 + 人力 + 时间 | 建议单独估,不要混进「成熟度」。 |
表 A:能力矩阵(给技术负责人看)
列:层位 · 输入语言 · 方法流派 · 结论强度 · 性质类 · 并发 · unsafe · 注解负担 · 规模上限
第 0 层:求解器与证明引擎
| 工具 | 起始 | 层位 | 输入语言 | 方法流派 | 结论强度 | 性质类 | 并发 | unsafe | 注解负担 | 规模上限 |
|---|
| Z3 | 2006 | 底层引擎 | API: C/C++/Python/Java/OCaml/JS | SMT 求解 | SAT/UNSAT 判定 | — | — | — | 无 | 命题/一阶/位向量 |
| CVC5/CVC4 | 2011/2021 | 底层引擎 | C++/Python/Java | SMT 求解 | SAT/UNSAT 判定 | — | — | — | 无 | 命题/一阶/位向量 |
| Alt-Ergo | 2007 | 底层引擎 | OCaml/API | SMT 求解 | SAT/UNSAT 判定 | — | — | — | 无 | 命题/一阶 |
| MiniSat/Glucose/CaDiCaL | 2003+ | 底层引擎 | C++ | SAT 求解 | 命题逻辑完备 | — | — | — | 无 | 命题逻辑 |
第 1 层:交互式定理证明器
| 工具 | 起始 | 层位 | 输入语言 | 方法流派 | 结论强度 | 性质类 | 并发 | unsafe | 注解负担 | 规模上限 |
|---|
| Coq | 1989 | 交互式定理证明 | Gallina(函数式),可提取为 OCaml/Haskell/Rust | 构造演算,小内核 | 无界全称(小内核可独立检查) | 全性质覆盖 | 有(Coq/SSReflect) | 需手工建模 | 极高(专家级) | 千行级核心模块 |
| Isabelle/HOL | 1986 | 交互式定理证明 | Isabelle/ML | 高阶逻辑,LCF 小内核;Sledgehammer 半自动 | 无界全称 | 全性质覆盖 | 有(Isabelle/IOAM) | 需手工建模 | 极高(专家级) | 十万行级(seL4) |
| HOL4/HOL Light | 1985/1998 | 交互式定理证明 | ML | 高阶逻辑,极小内核 | 无界全称 | 全性质覆盖 | 有限 | 需手工建模 | 极高 | 千行级 |
| Lean 4 | 2013 | 交互式定理证明(+提取) | Lean,可编译 C/LLVM | 依赖类型,小内核 | 无界全称 | 全性质覆盖 | 有限 | 需手工建模 | 高 | 千行级(工程侧爬坡中) |
| PVS | 1992 | 交互式定理证明 | PVS 语言 | 高阶逻辑 + 类型判定 | 无界全称 | 需求级验证 | 有限 | 需手工建模 | 高 | 中型系统 |
| ACL2 | 1997 | 交互式定理证明 | ACL2 Lisp 子集 | 一阶逻辑,自动化强 | 无界全称 | 处理器/浮点/硬件模型 | 有限 | — | 中 | 中型系统 |
| Agda | 2005 | 交互式定理证明 | Agda(依赖类型理论) | 构造演算(CIC),小内核 | 无界全称 | 全性质覆盖 | 有限 | 需手工建模 | 极高 | 千行级 |
| Idris | 2007 | 交互式定理证明+编程 | Idris(依赖类型) | 依赖类型+proof erasure | 无界全称 | 功能正确性+内存安全 | 有限 | 不支持 | 高 | 小规模到中型 |
| ATS | 2005 | 交互式定理证明+编程 | ATS(依赖类型,类C语法) | 依赖类型+线性类型 | 无界全称 | 内存安全+资源管理 | 有限 | 线性类型控资源 | 高 | 中小型 |
| CakeML | 2014 | 交互式定理证明+编译链 | CakeML(ML子集) | Coq内证明,端到端语义保持 | 无界全称 | 编译正确性(端到端) | N/A | 受限(纯函数式子集) | 极高 | 编译器级 |
第 2 层:演绎式程序验证(auto-active / SMT)
| 工具 | 起始 | 层位 | 输入语言 | 方法流派 | 结论强度 | 性质类 | 并发 | unsafe | 注解负担 | 规模上限 |
|---|
| SPARK 2014+GNATprove | 2014 | 代码级演绎 | Ada 子集 | 霍尔逻辑+Why3+多后端 SMT | 全称保证 | 无运行时错误+无数据竞争+部分功能正确性 | 有(SPARK RM) | 受限 | 中(契约标注) | 十万行级 |
| Dafny | 2008 | 代码级演绎 | Dafny → C#/Java/JS/Go/Python | auto-active + Z3 | 全称 | 功能正确性+内存安全 | 有限 | 受限 | 中 | 万行级 |
| F* | 2012 | 代码级演绎+提取 | F* → OCaml/C/Wasm/Vale汇编 | 依赖类型+Z3+手工tactics | 全称(提取路线) | 功能正确性+内存安全+恒定时间 | 有限 | 受限(Low*子集) | 高 | 万行级(HACL*进Linux内核) |
| Verus | 2024(SOSP'24) | 代码级演绎 | Rust子集(ghost/tracked/view) | auto-active + Z3 | 全称(unsafe+并发) | 内存安全+功能正确性+模块化并发 | 有(ownership+不变式) | 原生支持 | 中(ghost/exec二分) | 万行级 |
| Frama-C(WP/Eva) | 2008 | 代码级演绎 | C+ACSL | WP:霍尔逻辑+SMT全称;Eva:抽象解释 | 全称+过近似 | 运行时错误+部分功能正确性 | 有限 | 部分 | 中(ACSL标注) | 十万行级 |
| Why3 | ~2010 | 验证条件生成 | WhyML → C/Java/OCaml | 一阶逻辑,多prover交叉 | 全称(依赖后端) | 依赖后端 | 有限 | 有限 | 中 | 中型系统 |
| Prusti | 2018 | 代码级演绎 | Rust | 译成Viper/Silver,基于权限的分离逻辑 | 全称 | 内存安全+功能正确性 | 弱 | 半自动 | 低到中 | 千行级 |
| Creusot | ~2020 | 代码级演绎 | Rust | Why3后端,Pearlite规约语言 | 全称 | 内存安全+功能正确性 | 无 | 部分(prophecy编码) | 中 | 千行级 |
| Aeneas | ~2020 | 代码级演绎(翻译+手证) | Rust MIR → Lean/F* | Rust MIR→纯函数式模型后手证 | 全称(人工证) | 功能正确性 | 有限 | 需手工建模 | 高(Lean证明脚本) | 千行级 |
| KeY | 1990s | 代码级演绎 | Java+JML | 符号执行+演绎(动态逻辑相继式) | 全称 | 功能正确性 | 有限 | 不支持 | 高 | 小规模工业 |
| OpenJML | 2000s | 代码级演绎 | Java+JML | auto-active+SMT(JML注解+Z3/Coq) | 全称 | 功能正确性+运行时 | 有限 | 不支持 | 高 | 小规模工业 |
| veLLVM | 2010s | 代码级验证(LLVM IR) | LLVM IR | 演绎验证+SMT | 全称 | 内存安全+优化正确性 | 有限 | 原生(LLVM IR) | 中 | 模块级 |
| Stainless | 2015 | 代码级演绎 | Scala | SMT(Z3/CVC4)+依赖类型 | 全称 | 功能正确性+终止性 | 有限 | 部分 | 中 | 中小型 |
| LiquidHaskell | 2012 | 代码级验证 | Haskell(精炼类型注解) | 精炼类型+SMT(Z3) | 全称(类型检查即证) | 内存安全+越界 | 有限 | 不支持(Haskell无unsafe) | 低~中 | 千~万行 |
| Whiley | 2009 | 代码级演绎 | Whiley | 精炼类型+SMT(Z3) | 全称 | 内存安全+越界 | 有限 | 不支持 | 低 | 小规模 |
| Flux | 2023 | 代码级验证 | Rust(精炼类型注解) | 精炼类型+SMT(Z3) | 全称(类型检查即证) | 内存安全+功能性质 | 有限 | 不支持(Rust借用检查器已保内存安全) | 低 | 千~万行(爬坡中) |
| Gospel/Cameleer | 2010s | 代码级演绎 | OCaml+Gospel | 契约验证+Why3+SMT | 全称 | 功能正确性 | 有限 | 不支持 | 中 | 中小型 |
| coq-of-ocaml | 2010s | 代码级验证(翻译到Coq) | OCaml→Coq(Rocq) | OCaml→Coq翻译器 | 全称(依赖Coq) | 功能正确性 | 有限 | 需手工建模 | 高 | 中型(依赖Coq专家) |
| gospel-rtac | 2010s | 代码级验证(运行时) | OCaml | 运行时断言检查(Gospel规范+PPX) | 运行时保证 | 契约检查 | 有限 | 不支持 | 低 | 中小型 |
第 3 层:模型检验
| 工具 | 起始 | 层位 | 输入语言 | 方法流派 | 结论强度 | 性质类 | 并发 | unsafe | 注解负担 | 规模上限 |
|---|
| TLA+/TLC/PlusCal | 1999 | 设计/协议级 | TLA+/PlusCal | 显式状态枚举 | 有限状态全称,可证liveness | 并发正确性+活性+一致性 | 有(liveness) | N/A | 低(PlusCal入门) | 协议级 |
| Apalache | ~2019 | 设计/协议级 | TLA+子集 | TLA+的符号模型检验(SMT) | 有限状态全称(比TLC大) | 并发正确性+活性 | 有 | N/A | 低 | 大规模spec |
| TLAPS | 2000s | 设计/协议级 | TLA+ | TLA+的演绎证明补TLC | safety为主,liveness不完整 | 部分设计性质 | 有限 | N/A | 高 | 中型spec |
| SPIN/Promela | 1989 | 设计/协议级 | Promela(可嵌C) | LTL/w-regular,偏序规约 | 有限状态全称 | 协议一致性+并发错误 | 有 | N/A | 低 | 协议级 |
| NuSMV/nuXmv | 1999/2014 | 设计/协议级 | SMV | BDD+SAT,有限状态全称 | 有限状态全称(CTL/LTL) | 安全性+时序性质 | 有限 | N/A | 低 | 控制/安全协议 |
| UPPAAL | 1995 | 设计/协议级 | 网络时间自动机 | 时间自动机 | 实时活性/安全性,有限状态全称 | 实时系统性质 | 有 | N/A | 低 | 实时系统 |
| Alloy/Analyzer | 2000 | 设计/协议级 | Alloy | 有限域全称(small scope) | 有限域全称 | 结构模型快速找反例 | 有限 | N/A | 极低 | 设计早期 |
| CBMC | ~2001 | 代码级模型检验 | C/C++(C17/C++17) | SAT/SMT+循环展开 | 有界全称,位精确 | 内存安全+溢出+断言 | 有界交错 | 部分 | 低(__CPROVER_assert) | 模块级 |
| Kani | 2021 | 代码级模型检验 | Rust(含unsafe) | MIR→goto-program→CBMC | 有界全称+近年归纳做无界 | 内存安全+UB+断言 | 部分 | 原生支持 | 极低(零注解起步) | 模块级 |
| ESBMC/SeaHorn/KLEE/SymCC | 2011/2015/2008 | 代码级模型检验 | C/C++/LLVM IR | 符号执行与有界验证 | 有界,路径覆盖导向 | 内存安全+UB | 有限 | 部分 | 低到中 | 嵌入式/竞赛 |
| Loom/Shuttle/model-checker-rs | 近年 | 代码级模型检验 | Rust/C | 确定性/随机线程交错枚举 | sound但规模很小 | 并发bug | 有(但小) | 原生(Rust) | 低 | 小规模 |
| herd7 | 近年 | 内存模型级 | litmus测试 | 内存模型形式化验证 | 内存模型正确性 | x86-TSO/ARMv8/LKMM/PTX | N/A | N/A | 中 | 内存模型 |
| StateRight | 近年 | 设计/协议级 | Rust | 显式状态空间穷举(DFS/BFS) | 有限状态全称 | 并发正确性+活性(LTL)+一致性 | 有(穷举交错) | N/A | 中(需写模型) | 协议级(受状态爆炸限制) |
第 4 层:抽象解释与无假阴性静态分析
| 工具 | 起始 | 层位 | 输入语言 | 方法流派 | 结论强度 | 性质类 | 并发 | unsafe | 注解负担 | 规模上限 |
|---|
| Astrée | 2003 | 代码级分析 | C(SCADE生成代码最佳) | 抽象解释,无假阴性 | 无漏报有误报 | 运行时错误+数据竞争 | 有限 | 部分 | 零注解 | 五十万行级 |
| Polyspace Code Prover | 1998 | 代码级分析 | C/C++/Ada | 抽象解释,无假阴性 | 无漏报有误报 | 运行时错误 | 有限 | 部分 | 零注解 | 十万行级 |
| aiT/StackAnalyzer | 2000s | 代码级分析 | 二进制/ELF | 抽象解释+ILP | WCET/栈用量上界保证 | 时序分析 | N/A | N/A | 零注解 | 二进制级 |
| RuleChecker/Coverity/LDRA | 各异 | 代码级分析 | C/C++/Ada | 规则级分析 | 规则级 | MISRA/CERT覆盖 | 有限 | 部分 | 极低 | 大规模存量代码 |
| Dialyzer | 1990s | 代码级分析(静态) | Erlang | Success Typings(抽象解释变体) | 无漏报有误报(过近似) | 类型错误+模式匹配遗漏 | 有限 | N/A(Erlang无unsafe) | 极低 | 大规模(电信生产) |
第 5 层:硬件与 RTL 形式验证
| 工具 | 起始 | 层位 | 输入语言 | 方法流派 | 结论强度 | 性质类 | 并发 | unsafe | 注解负担 | 规模上限 |
|---|
| JasperGold | 2010s | RTL/硬件 | SystemVerilog/SVA/PSL | IC3/PDR等,安全性质全称 | 安全性质全称(受收敛限制) | 属性验证+CDC+安全+等价 | — | N/A | 高 | SoC签核级 |
| VC Formal/Formality/SpyGlass | 长期 | RTL/硬件 | SV/SVA | RTL属性验证/RTL-to-门级等价 | 等价性检查(数学意义功能等价) | RTL等价+CDC+复位 | — | N/A | 高 | SoC签核级 |
| Questa Formal | 长期 | RTL/硬件 | SV/UVM | 断言验证,仿真-形式统一 | 同上 | 属性验证 | — | N/A | 高 | SoC签核级 |
| OneSpin 360-DBV | 2014 | RTL/硬件 | SV/SVA | 高端形式验证 | 同上 | 安全芯片/侧信道/硬件木马 | — | N/A | 高 | SoC签核级 |
| Yosys+SymbiYosys | 2012+ | RTL/硬件(开源) | Verilog/SVA | 有界/IC3 | 有界/IC3 | FPGA/开源CPU流程 | — | N/A | 中 | FPGA/小CPU |
| SCADE Suite/Design Verifier+Lesar | 1990s | 模型级 | Lustre/SCADE | 模型级形式验证(BDD) | 模型级安全性全称 | 模型驱动开发+直接出DO-178C A级代码 | — | N/A | 中 | 航空/核电 |
| Simulink Design Verifier | 2000s | 模型级 | Simulink/Stateflow | 模型级性质证明与测试生成 | 模型级 | 汽车/航空MBD流程 | — | N/A | 低 | 汽车/航空 |
第 6 层:已验证编译器与工程件
| 工具 | 起始 | 层位 | 输入语言 | 方法流派 | 结论强度 | 性质类 | 并发 | unsafe | 注解负担 | 规模上限 |
|---|
| CompCert | 2006 | 编译链 | Clight子集→PowerPC/ARM/x86/RISC-V | Coq内证明,编译不掉链子 | 语义保持(端到端) | 编译正确性 | N/A | 受限(Clight子集) | 极高 | 编译器级 |
| Vale | ~2015 | 代码级验证(汇编) | AVX-512/RISC-V汇编 | 在F*里直接验证手写汇编 | 全称(含恒定时间/侧信道) | 汇编正确性+侧信道 | N/A | 原生(汇编) | 高(F*证明) | 汇编模块级 |
| Cryptol+SAW | ~2004/~2014 | 代码级验证 | Cryptol规范+LLVM/CRU词项 | 密码算法规范与实现等价证明 | 全称(SAT/SMT支撑) | 密码实现等价性 | N/A | 部分 | 高 | 密码库级 |
| Cogent/TrustFoundry | 2010s | 编译链(组件级) | Cogent→C | 受限函数式语言→C的已证编译器 | 组件级语义保持 | 组件级正确性 | N/A | 受限 | 高 | 组件级 |
| Certora | 2019 | 代码级验证 | Solidity/EVM(CVL规范) | SMT全称(有界/模块化) | SMT全称 | 智能合约安全 | 有限 | N/A | 中 | 合约级 |
| Event-B/Atelier B/ProB | 1990s-2000s | 设计/实现级 | B方法 | 精化式开发 | 精化链全称 | 铁路信号系统 | 有限 | 有限 | 高 | 铁路信号级 |
| Z-notation | 1980s | 设计/规格说明 | Z(集合论+关系代数) | 集合论规约 | 规格级 | 系统规格+不变式 | 有限 | N/A | 高 | 中型 |
| VDM/Overture | 1970s | 设计/实现级 | VDM-SL | 精化式开发 | 精化链全称 | 系统规格+操作正确性 | 有(VDM-SC) | 有限 | 高 | 中型 |
表 B:信任与合规(给安全/认证/审计看)
列:信任基 · 编译链覆盖 · 认证背书 · 证据形态 · 维护方与许可
| 工具 | 信任基干净度 | 编译链覆盖 | 认证背书 | 证据形态 | 维护方与许可 |
|---|
| Coq | 小内核可独立检查 | CompCert(配套) | JavaCard EAL7(12万行Coq) | 机器检查证明脚本 | Inria+社区(开源) |
| Isabelle/HOL | 小内核可独立检查 | seL4二进制证明(HOL4) | AWS Nitro(25万行证明) | 机器检查证明脚本 | Cambridge+TUM+Data61(开源) |
| HOL4/HOL Light | 极小内核 | seL4二进制级 | AMD Zen4 TLB同步验证 | 机器检查证明脚本 | 社区/AWS(开源) |
| Lean 4 | 小内核可独立检查 | 内置编译器(带运行时) | 数学库为主 | 机器检查证明脚本 | 开源社区+云厂商 |
| PVS | 高阶逻辑 | — | NASA航天器需求验证 | 机器检查证明脚本 | SRI International |
| ACL2 | 一阶逻辑 | AMD/Intel浮点/微码验证 | 处理器认证 | 机器检查证明脚本 | UT Austin+社区 |
| SPARK 2014+GNATprove | 依赖求解器(版本钉死) | — | DO-178C A/B级(可替代测试) | 认证材料包+证明报告 | AdaCore+Capgemini(商业) |
| Dafny | 依赖求解器(Z3) | — | IronFleet研究原型 | 求解器日志+证明报告 | MSR+开源 |
| F* | 依赖求解器(Z3) | KaRaMel→C(语义保持到Clight) | HACL*进Linux内核/Firefox | 证明产物+提取代码 | MSR+INRIA(开源) |
| Verus | 依赖求解器(Z3) | — | AWS Nitro Enclaves/Asterinas | 求解器日志+证明报告 | MSR+AWS+社区(开源) |
| Frama-C | 依赖求解器 | — | 法国核能/航空/汽车 | 证明报告+分析报告 | CEA+工业联盟(开源) |
| TLA+/TLC | 有限状态模型 | — | AWS DynamoDB/S3/EBS/Azure Cosmos | 模型+反例轨迹 | 社区+TLAF(Linux Foundation) |
| Apalache | 有限状态模型(SMT) | — | Cosmos DB等大规模spec | 模型+反例轨迹 | Informal Systems |
| SPIN | 有限状态模型 | — | NASA火星探测器/IEEE 802.11 | 反例轨迹(ACM软件系统奖) | 社区(Bell Labs遗产) |
| CBMC | 工具本身未验证 | — | AWS FreeRTOS/s2n-tls | 可执行反例+报告 | Diffblue+社区 |
| Kani | 工具本身未验证 | — | AWS生产CI常驻 | 可执行反例+报告 | AWS(开源) |
| Astrée | 工具本身未验证(认证包) | — | DO-178C/ISO 26262/EN 50128 | 分析报告(无假阴性) | AbsInt(dSPACE伙伴) |
| Polyspace | 工具本身未验证 | — | 汽车/航空/核电主流 | 分析报告 | MathWorks(商业) |
| JasperGold | EDA工具鉴定 | — | SoC签核工业标准 | 属性验证报告 | Cadence(商业) |
| Formality | EDA工具鉴定 | — | ASIC/SoC流程必备 | 等价性检查报告 | Synopsys(商业) |
| CompCert | 小内核可独立检查(Coq) | 已证编译器(Clight→多架构) | DO-178C工具鉴定路径 | Coq证明脚本 | Inria+AbsInt(商业版) |
| Vale | 依赖F*求解器 | F*→汇编(语义保持) | Tezos/Hyper-V | 证明产物 | MSR(开源) |
| Certora | 依赖求解器 | — | DeFi工业标准(OpenZeppelin/Compound) | SMT证明报告 | Certora Inc.(商业) |
| SCADE Suite | 模型级(Ansys) | — | DO-178C A级代码 | 模型验证报告 | Ansys(商业) |
| veLLVM | 依赖求解器 | — | 学术研究 | SMT证明/反例 | 学术社区(开源) |
| CakeML | 小内核可独立检查(Coq) | 编译器端到端证明 | — | Coq证明脚本 | 剑桥大学+社区(开源) |
| Idris | 小内核(验证中) | — | — | 类型检查 | 社区(开源) |
| Agda | 小内核可独立检查 | — | — | 机器检查证明脚本 | 社区(开源) |
| ATS | 依赖求解器 | ATS→C | — | 类型检查/证明脚本 | 作者维护(开源) |
| Dialyzer | 工具本身未验证 | Erlang/OTP | Ericsson生产使用(数十年) | 静态分析报告 | Ericsson+社区(开源) |
| Stainless | 依赖求解器 | Scala→JVM | — | SMT证明/反例 | EPFL LARA(开源) |
| LiquidHaskell | 依赖求解器(Z3) | Haskell→GHC | — | SMT证明/反例 | 学术界+社区(开源) |
| Z-notation | 工具本身未验证 | 无(规约语言) | — | 规约文档 | 社区(开源CZT) |
| VDM/Overture | 工具本身未验证 | VDM→代码生成 | — | 规约文档/精化证明 | Overture社区(开源) |
| Whiley | 依赖求解器(Z3) | Whiley→JVM/JS | — | SMT证明/反例 | 独立开发(开源) |
| Flux | 依赖求解器(Z3) | Rust→LLVM | — | SMT证明/反例 | 学术界+社区(开源) |
| KeY | 工具本身未验证 | — | 教学/小规模工业(验证TimSort等) | 证明报告+反例 | 社区(开源GPLv2) |
| OpenJML | 工具本身未验证 | — | 教学/小型项目 | SMT证明/反例 | 社区(开源) |
| Gospel/Cameleer | 依赖求解器(Why3) | OCaml→Why3 | — | SMT证明/反例 | 社区(开源) |
| coq-of-ocaml | 依赖Coq内核 | OCaml→Coq | Tezos区块链(10万行OCaml验证) | Coq证明脚本 | 社区(开源) |
| gospel-rtac | 依赖Coq/Isabelle元理论 | OCaml(PPX运行时注入) | — | Coq/Isabelle元理论证明+运行时报告 | 社区(开源) |
| StateRight | 有限状态模型 | — | — | 反例轨迹(动作序列) | 社区(开源) |
表 C:落地风险(给项目经理看)
列:工业案例 · 活跃度/是否停更 · 证明回归 · 人才曲线 · 成本 · 明确不适用场景
| 工具 | 工业案例与生产常驻 | 活跃度/是否停更 | 证明资产可持续性 | 人才可得性/学习曲线 | 成本 | 明确不适用场景 |
|---|
| Coq | CompCert/JavaCard EAL7/四色定理 | 活跃 | CI回归可行但需专家 | 全球稀缺,极高门槛 | 极高 | 大规模代码库日常验证 |
| Isabelle/HOL | seL4/AWS Nitro/WebAssembly | 活跃 | CI回归可行但需专家 | 全球稀缺,极高门槛 | 极高 | 快速原型/小团队 |
| HOL4/HOL Light | seL4二进制证明/AMD密码优化 | 低活跃(社区维护) | 需人工 | 全球稀缺 | 极高 | 新项目主力工具 |
| Lean 4 | 数学库为主,工程侧爬坡 | 非常活跃 | CI回归可行 | 中等(现代化语法) | 高 | 裸系统代码提取(GC问题) |
| PVS | NASA航天器 | 低活跃 | 需人工 | 稀缺 | 高 | 需要高自动化的场景 |
| ACL2 | AMD/Intel浮点/微码 | 低活跃 | 需人工 | 稀缺 | 高 | 现代系统软件验证 |
| SPARK 2014+GNATprove | Eurofighter/Rolls-Royce/NVIDIA | 活跃(商业维护) | CI回归成熟 | 中等(Ada需学但生态好) | 中高 | 需要提取代码的场景 |
| Dafny | IronFleet/Amazon多处使用 | 活跃(开源) | CI回归可行 | 中等 | 中 | 需要端到端编译链的场景 |
| F* | HACL*(Linux/Firefox)/EverParse(Azure)/Tezos | 活跃 | CI回归可行但钉死Z3版本 | 高(F*语法+证明) | 高 | 需要高阶抽象的场景(Low*削掉) |
| Verus | AWS Nitro/IronKV/Asterinas | 非常活跃(快速迭代) | CI回归中,版本变化快 | 中(Rust生态) | 中 | 需要长期稳定证明资产的场景(生态仍变) |
| Frama-C | 法国核能/航空/汽车 | 活跃 | CI回归可行 | 中等(ACSL标注) | 中 | 需要并发证明的场景 |
| TLA+/TLC | AWS六个关键系统/Azure Cosmos/Intel/Microsoft/PingCAP | 活跃(TLAF成立) | 需轨迹确认对齐代码 | 中等(PlusCal入门低) | 低中 | 代码级验证(只管设计层) |
| Apalache | Cosmos DB等大规模spec | 活跃 | 需轨迹确认 | 中等 | 低中 | 需要liveness证明的大规模spec |
| SPIN | NASA/IEEE协议族 | 稳定维护 | 反例可读 | 低中 | 低 | 代码级验证 |
| CBMC | AWS FreeRTOS/s2n-tls/医疗航空 | 活跃 | CI回归成熟 | 低(零注解起步) | 低 | 需要全称保证的场景(有界) |
| Kani | AWS生产CI/开源项目 | 非常活跃 | CI回归成熟 | 极低(零注解) | 低 | 需要全称保证的场景(有界) |
| Astrée | 空客电传飞控(A340/A380) | 活跃(商业维护) | 确定性可重复 | 低(零注解) | 高(许可证) | 功能正确性/活性/并发 |
| Polyspace | 汽车/航空/核电主流 | 活跃(商业维护) | 确定性可重复 | 低 | 高(许可证) | 功能正确性/并发 |
| JasperGold | SoC签核主流 | 活跃(商业维护) | 确定性 | 中 | 极高(商业套件) | 软件验证 |
| Formality | ASIC/SoC流程必备 | 活跃(商业维护) | 确定性 | 中 | 极高(商业套件) | 软件验证 |
| CompCert | CertiKOS/mC2 | 活跃(Inria) | Coq证明可回归 | 极高(CompCert内部) | 高 | 需要C完整子集的场景(仅Clight) |
| Vale | Tezos/Hyper-V | 活跃(MSR) | F*证明可回归 | 高(F*+汇编) | 中 | 高级语言代码验证 |
| Certora | DeFi(OpenZeppelin/Compound/Aave) | 活跃(商业) | CI回归 | 低中(Solidity) | 中 | 非区块链场景 |
| SCADE Suite | 空客电传飞控核心库 | 活跃(Ansys) | 模型可回归 | 中 | 高 | 通用软件验证 |
| veLLVM | 学术研究为主 | 活跃(学术) | 高(LLVM+形式化) | 低(开源) | 源码级验证 | |
| CakeML | 学术研究(编译器验证) | 活跃(剑桥) | 极高(Coq+编译器) | 低(开源) | 系统编程/高效运行 | |
| Idris | 教学/研究 | 稳定维护 | 高(依赖类型) | 低(开源) | 大规模工业代码 | |
| Agda | 学术(PL理论/语义) | 活跃 | 极高(依赖类型) | 低(开源) | 代码提取到生产语言 | |
| ATS | 少量工业实验 | 稳定维护 | 高(依赖类型+线性) | 低(开源) | 大型生态库交互 | |
| Dialyzer | Ericsson电信交换机(数十年) | 活跃(OTP标配) | 极低(Erlang生态) | 低(开源) | 功能正确性证明 | |
| Stainless | 研究/教学 | 活跃(EPFL) | 中(Scala+形式化) | 低(开源) | 系统编程/并发 | |
| LiquidHaskell | 研究/教学/少量工业 | 活跃 | 中(Haskell+SMT) | 低(开源) | 系统编程/FFI | |
| Z-notation | 历史工业(航空/通信) | 低活跃 | 高(数学规格) | 低(开源) | 代码生成/自动化 | |
| VDM/Overture | 医药/通信(少量) | 活跃(开源) | 高(数学规格) | 低(开源) | DO-178C认证 | |
| Whiley | 教学/研究 | 稳定维护 | 中(精炼类型) | 低(开源) | 系统编程/大规模 | |
| Flux | 研究/实验 | 非常活跃(快速迭代) | 中(Rust生态) | 低(开源) | 并发/unsafe/生产稳定 | |
| KeY | 教学/小规模工业(验证TimSort等) | 稳定维护 | 中(动态逻辑) | 中(Java+逻辑) | 低(开源) | 大规模代码库验证 |
| OpenJML | 教学/小型项目 | 稳定维护 | 中(SMT版本敏感) | 中(JML标注) | 低(开源) | 大规模工业项目/并发 |
| Gospel/Cameleer | 研究/教学 | 活跃开发中 | 中(Why3+SMT) | 中(OCaml+契约) | 低(开源) | 大规模工业代码 |
| coq-of-ocaml | 依赖Coq生态 | Tezos区块链(10万行OCaml) | 活跃(学术) | 高(Coq专家) | 低(开源) | 不需要Coq证明的场景 |
| gospel-rtac | 研究/教学 | 活跃开发中 | 中(Coq/Isabelle元理论) | 中(OCaml+Gospel) | 低(开源) | 需要无界全称保证的场景 |
| StateRight | Rust项目(实验性) | 活跃开发中 | 需手工建模 | 中(Rust生态) | 低(开源) | 状态爆炸/大规模协议/需要代码级验证的场景 |
工具逐条速查(按技术流派分组)
求解器与证明引擎
- Z3 (2006, Microsoft Research, MIT许可) — SMT求解器事实标准,Herbrand Award 2019。几乎所有auto-active工具都靠它。但本身不产生「数学证明」,只给出可满足性判定。
- CVC5/CVC4 (2011/2021, Stanford+UIowa+NYU) — Z3的替代/互补后端。学术与部分工业流程双后端。
- Alt-Ergo (2007, OCamlPro) — 专为程序验证调优的SMT。Frama-C、GNATprove的默认后端之一。
- MiniSat/Glucose/CaDiCaL (2003+, 开源) — SAT求解内核。BMC/EDA工具的底层引擎。
交互式定理证明器
- Coq (1989, Inria+社区) — 构造演算,小内核可独立检查。CompCert、JavaCard EAL7(12万行Coq)、Fiat-Crypto、RISC-V规范、四色定理/Feit-Thompson。可提取代码。
- Isabelle/HOL (1986, Cambridge+TUM+Data61) — 高阶逻辑,LCF小内核。seL4(20万行起)、AWS Nitro隔离引擎(25万行证明)、WebAssembly语义。
- HOL4/HOL Light (1985/1998) — 高阶逻辑极小内核。seL4二进制等价证明、Graviton2密码优化、AMD Zen4 TLB同步验证。
- Lean 4 (2013, 开源社区+云厂商) — 依赖类型。数学库最猛;工程侧仍在爬坡。内置编译器带GC运行时,不适合裸系统代码提取。
- PVS (1992, SRI International) — 高阶逻辑+类型判定。NASA大量使用(航天器需求验证),航空标准常客。
- ACL2 (1997, UT Austin+社区) — 一阶逻辑自动化强。AMD/Intel用其验证浮点单元与微码。
演绎式程序验证(auto-active / SMT)
- SPARK 2014+GNATprove (2014, AdaCore+Capgemini) — Ada子集,霍尔逻辑+Why3+多后端SMT。最成熟的工业路线之一:Eurofighter Typhoon、Rolls-Royce Trent、Muen分离内核、NVIDIA安全固件。可在DO-178C A级流程中替代部分单元测试。「证明跟着代码走」在工业界的标杆。
- Dafny (2008, MSR+开源) — 自有语言可编译到C#/Java/Go/JS/Python。IronFleet/Ironclad全栈验证内核+驱动+密码库+分布式系统。
- F* (2012, MSR+INRIA) — 证明导向编程+提取无GC C/汇编。唯一真正进生产基础设施的提取路线:HACL*(Firefox 57起/Linux内核lib/crypto/WireGuard/Python hashlib)、EverParse(Azure/Hyper-V报文解析)、ElectionGuard、Tezos。
- Verus (2024 SOSP'24, MSR+AWS+社区) — Rust子集,auto-active+Z3,支持unsafe与并发模块化推理。AWS Nitro Enclaves核心原语、IronKV、Atmosphere OS、Asterinas vostd(CertiK合作)。能力最强但最年轻,生态仍在快速变。
- Frama-C WP/Eva (2008, CEA+工业联盟) — C代码契约验证(ACSL标注)。法国核能/航空/汽车。WP:霍尔逻辑+SMT全称;Eva:抽象解释。
- Why3 (~2010, INRIA) — 验证条件生成器+多后端编排。GNATprove/Creusot的中间层。
- Prusti (2018, ETH) — Rust→Viper/Silver,基于权限的分离逻辑。学术活跃,工业落地有限。
- Creusot (~2020, INRIA) — Rust→Why3,Pearlite规约语言。亮点是&mut的prophecy编码。
- Aeneas (~2020, MSR) — Rust MIR→纯函数式模型(Lean/F*)后再手证。微软SymCrypt已验证SHA-3/ML-KEM并公开产物。
- KeY (1990s, 社区, GPLv2) — Java演绎式验证器,基于动态逻辑的相继式演算,实现前向符号执行。结合auto-active和细粒度交互证明,支持在源代码级别调试证明。验证了TimSort等复杂Java代码。开源纯Java实现,跨平台。适合教学和复杂代码验证。
- OpenJML (2000s, 社区, 开源) — Java Modeling Language (JML)的参考实现,auto-active路线。在Java代码中用JML注解写契约(requires/ensures/maintaining),通过SMT求解器自动验证。有Eclipse插件和VSCode扩展。用于高校教学和小型项目研究。不支持大型工业项目和并发验证。
- Gospel/Cameleer (2010s, 社区, 开源) — Gospel是专为OCaml设计的行为规范语言,用契约式风格在.mli文件中定义前置条件、后置条件、不变式,语义基于分离逻辑;Cameleer是Gospel的演绎验证后端,将OCaml+Gospel规约翻译为Why3,再用SMT求解器自动验证。活跃开发中,适合OCaml项目的契约验证。
- coq-of-ocaml (2010s, 社区, 开源) — 将OCaml代码翻译为Coq(Rocq)代码的翻译器。支持函数式核心、类型定义、单子程序、模块、函子,对GADTs和多态变体提供部分支持。工业案例:Tezos区块链约10万行OCaml代码的验证(内部错误缺失、向后兼容性、不变式保持、序列化正确性)。适合需要绝对正确性的OCaml核心组件验证。
- gospel-rtac (2010s, 社区, 开源) — 基于Gospel规范,用PPX机制将规约自动翻译为类型安全的OCaml运行时检查代码,在函数入口/出口、循环边界注入校验逻辑。检查器本身经过Coq或Isabelle/HOL元理论证明,确保健全性。适合需要运行时保证的OCaml项目。
模型检验
- TLA+/TLC/PlusCal (1999, 社区+TLAF/Linux Foundation) — 并发与分布式协议设计级验证。工业应用最完整的协议验证案例集:AWS DynamoDB/S3/EBS、Azure Cosmos DB、Intel/Microsoft/PingCAP(Raft)。唯一获此地位的模型检验工具。可证liveness。
- Apalache (~2019, Informal Systems) — TLA+的符号模型检验(SMT)。能处理比TLC大得多的状态空间。
- TLAPS (2000s) — TLA+的演绎证明补TLC。主要覆盖safety,liveness支持不完整。
- SPIN/Promela (1989, 社区) — 协议一致性与并发错误。NASA火星探测器(1996发射前纠错)、Lucent 5ESS、IEEE 802.11/蓝牙协议族验证。唯一获ACM软件系统奖的模型检验器。
- NuSMV/nuXmv (1999/2014, FBK) — 符号模型检验(CTL/LTL)。工业控制、轨道交通、安全协议。
- UPPAAL (1995, Aalborg+Uppsala) — 时间自动机(实时系统)。汽车电子、Bang & Olufsen音频协议(著名bug发现案例)。
- Alloy/Analyzer (2000, MIT) — 结构模型的轻量穷举分析。设计早期快速找反例。
- CBMC (~2001, Diffblue+社区) — C/C++有界模型检验。AWS FreeRTOS验证版、s2n-tls、医疗/航空嵌入式。位精确、反例可读。
- Kani (2021, AWS) — Rust版CBMC(MIR→goto-program)。AWS生产CI常驻,已在开源项目发现未知bug。零注解起步。
- ESBMC/SeaHorn/KLEE/SymCC (2011/2015/2008+) — C/C++符号执行与有界验证。嵌入式与竞赛场景。
- Loom/Shuttle/model-checker-rs (近年) — Rust/C11内存模型级交错枚举。内核内存屏障验证必用。
- herd7 (近年) — 验内存模型本身(x86-TSO/ARMv8/LKMM/PTX)。Linux自己的LKMM就是用herd7形式化的。
- StateRight (近年, 社区, 开源) — Rust显式状态模型检查器。用Rust代码定义State/Action类型并实现Model trait,调用spawn_dfs()/BFS进行穷举状态空间搜索。擅长共识/选举/复制状态机/缓存一致性/消息传递协议验证,支持safety(invariant)和liveness(LTL)性质检查,输出最短反例轨迹。提供actor运行时,同一份代码既能模型检查也能在真实网络中运行。内置linearizability/sequential consistency tester。短板:状态爆炸时需手工抽象(如将"任意任期"压成"相等/不等/大一格"三类),量化性质表达笨重,社区规模较小。
抽象解释与静态分析
- Astrée (2003, AbsInt/dSPACE) — 证明C程序无运行时错误与数据竞争。空客电传飞控(A340/A380级别,50万行可分析、误报近零)。DO-178C/ISO 26262/EN 50128鉴定包。
- Polyspace Code Prover (1998, MathWorks) — 同Astrée,Simulink/Embedded Coder生态。汽车/航空/核电主流。
- aiT/StackAnalyzer (2000s, AbsInt) — WCET与栈用量上界分析(二进制级)。丰田非预期加速调查中被引用为工业基准。
- RuleChecker/Coverity/LDRA Testbed (各异) — MISRA/CERT规则+单元覆盖+工具鉴定。车规/航电认证流水线的日常件。
硬件与 RTL 形式验证
- JasperGold (2010s, Cadence) — 属性验证、CDC、低功耗、安全、等价。SoC签核主流。
- VC Formal/Formality/SpyGlass Formal (长期, Synopsys) — RTL属性验证/RTL-to-门级等价/CDC-复位签核。ASIC/SoC流程必备。
- Questa Formal (长期, Siemens EDA) — 断言验证,仿真-形式统一平台。与UVM生态整合最好。
- OneSpin 360-DBV (2014, Siemens) — 高端形式验证。金融/安全芯片、侧信道与硬件木马。
- Yosys+SymbiYosys (2012+, 开源) — 开源形式验证栈。FPGA与开源CPU流程主力。rIC3(2024国际硬件模型检测竞赛双赛道第一)。
- SCADE Suite/Design Verifier+Lesar (1990s, Ansys) — 模型驱动开发+模型级形式验证,直接出DO-178C A级代码。空客电传飞控核心库。
- Simulink Design Verifier (2000s, MathWorks) — 模型级性质证明与测试生成。汽车/航空MBD流程标配。
已验证编译器与工程件
- CompCert (2006, Inria+AbsInt) — 已证语义保持的C编译器。Clight子集→PowerPC/ARM/x86/RISC-V。首个工业级已证编译器;AbsInt提供认证包;CertiKOS/mC2的编译链。
- Vale (~2015, MSR) — 在F*里直接验证手写汇编。Tezos密码实现、Hyper-V边界;内核入口/上下文切换的正解。
- Cryptol+SAW (~2004/~2014, Galois→Amazon) — 密码算法规范与实现等价证明。AWS s2n-tls、NSA/Galois多项密码库审计。
- Cogent/TrustFoundry (2010s, Data61/NICTA) — 受限函数式语言→C的已证编译器。seL4生态里「提取路线」的真实落地点(只做组件,不做全内核)。
- Certora (2019, Certora Inc.) — 智能合约规范与验证。DeFi工业标准,OpenZeppelin/Compound/Aave常备。
- Event-B/Atelier B/ProB (1990s-2000s) — 精化式开发,铁路信号。巴黎地铁自动化/西门子铁路信号类项目,EN 50128语境下成熟。
三条路线对照
| 路线 | 工件数量 | 谁决定内存布局/性能 | 典型代表 |
|---|
| 提取(Curry-Howard路线) | 一份函数式程序→编译器吐出C | 提取器,程序员控制力弱 | F*/Low*+KaRaMel、CertiCoq、Cogent |
| 精炼(Refinement) | 抽象规范+手写实现+精炼证明 | 程序员 | seL4、CertiKOS、IronFleet |
| 证明跟着代码走(注解式/原位验证) | 一份带注解的实现 | 程序员,100% | SPARK、Dafny、Verus、Frama-C WP |
核心差异:提取路线的代价是放弃对底层的控制,精炼路线的代价是写两遍,注解路线的代价是注解负担与重构脆弱性。三者都没有真正「只写一遍」,只是把第二遍的成本转移到了不同位置。
工具归类速查(按 A/B/C 三层)
| 层 | 问题 | 代表工具 |
|---|
| A. 设计/协议层 | 还没有代码,或代码太复杂,只想确认协议、并发逻辑没错 | TLA+/TLC/Apalache、SPIN、Quint、PlusCal、P、Ivy |
| B. 代码级演绎验证 | 这份源码对所有输入都满足规约 | Verus、Prusti、Creusot、Aeneas、Dafny、SPARK/GNATprove、Frama-C WP |
| C. 代码级模型检验 | 这份源码在给定边界内没有反例(能找bug,通常不给全称保证) | Kani、CBMC、Loom、Shuttle、model-checker-rs |
信任基干净程度排序
从最干净往下:
- Coq/Isabelle 小内核 + CompCert(可独立检查证明证书)
- seL4/HOL4 二进制级证明
- SPARK/Dafny/Verus/F*(Z3 + 运行时假设)—— 求解器版本钉死是硬伤
- CBMC/Kani/TLA+(有界)
- Rust 借用检查 + unsafe 审计
- Astrée/Polyspace(抽象解释,可能误报)
- 纯认证流程(PikeOS/鸿蒙 EAL 级,流程保证而非定理)
选型建议
按你要证的性质选
| 你要证的 | 首选 | 备选 | 别用 |
|---|
| 协议/并发设计正确性(死锁、活锁、一致性) | TLA+ + TLC/Apalache(务必做轨迹确认对齐代码) | PlusCal入门、P/Ivy | Coq(写不动大协议) |
| TCB内unsafe、锁、页表、分配器 | Verus | Kani(无注解扫UB)、RAPx(零注解筛子) | Prusti/Creusot(unsafe与并发不达标) |
| 汇编入口、中断、cache/TLB | Vale(手写汇编+F*)或 Bedrock2 | 手写+二进制级验证 | 任何Rust工具 |
| 算法层(cap table、位图、IPC编组) | Verus(省事)或 F*/Steel→KaRaMel→C(想保留提取) | Aeneas→Lean | — |
| 内存模型/屏障够不够 | herd7 + LKMM/PTX cat + litmus | Loom/Shuttle/model-checker-rs | CBMC(不完备) |
| 要过DO-178C/ISO 26262/EN 50128 | SPARK 2014 或 SCADE + Astrée/Polyspace + aiT | CompCert商业版(工具鉴定) | Coq/Isabelle(成本不可控) |
| 编译链接不掉链子 | CompCert,或对gcc/clang产物做HOL4二进制等价 | — | 假设编译器正确 |
| RTL/SoC侧(如果还做定制硬件) | JasperGold / VC Formal / Formality | Yosys+SymbiYosys+rIC3(开源) | 纯仿真 |
三个务实提醒
- 不要把「起始年份」当成熟度。SPIN 1989、TLA+ 1999 很老但依然主流;Ironclad 很强但已停更。成熟度应由「是否有生产常驻 + 是否有人维护」定义。
- 强度与成熟度负相关是常态。最强的(Coq/Isabelle 端到端)往往最难落地;最好落地的(Kani/Astrée)给的结论最受限。
- 留一栏「组合关系」。这些工具极少单独使用,标注互补关系(如 Kani→Verus、TLA++轨迹确认、Astrée+WP)比孤立评分更有用。工业上的实际形态都是组合:TLA+ 管设计 + Verus/SPARK 管 TCB + CBMC/Kani 扫 unsafe + herd7 管内存模型 + CompCert/二进制证明管编译链。
推荐工具
以下推荐基于开源许可、成熟度、活跃度、工业/学术背书四个维度综合筛选,按上手难度从低到高排列。每个推荐都标注了适用场景与不适用场景,方便快速决策。
零注解 / 低门槛路线(先跑起来再说)
适合:想以最低成本获得形式化反馈,团队没有形式化背景。
| 工具 | 语言 | 定位 | 推荐理由 | 明确不适用 |
|---|
| CBMC | C/C++ | 有界模型检验 | 工业界最成熟的C/C++模型检验器,AWS FreeRTOS/s2n-tls生产常驻,零注解起步,反例可读 | 需要无界全称保证的场景 |
| ESBMC | C/C++ | 有界模型检验 | CBMC的现代化替代,支持C17/C++17,SMT后端可换,竞赛与嵌入式场景活跃 | 需要无界保证的场景 |
| Kani | Rust | 有界模型检验 | Rust生态的CBMC(AWS出品),零注解起步,AWS生产CI常驻,2026年ASE论文正式发表 | 需要无界全称保证的场景 |
| Dialyzer | Erlang | 静态分析 | Erlang/OTP内置,零配置可用,Ericsson电信交换机部署数十年 | 需要功能正确性证明的场景 |
建议:C/C++项目先用 CBMC 或 ESBMC 跑一轮有界模型检查,零注解成本就能发现不少深层 bug。Rust 项目直接用 Kani。
auto-active 路线(注解负担中等,性价比最高)
适合:团队愿意写少量契约注解,换取自动化验证收益。
| 工具 | 语言 | 定位 | 推荐理由 | 明确不适用 |
|---|
| Dafny | Dafny | 代码级演绎 | 微软研究院出品,语法类似Scala/Java,学习曲线平缓,SMT自动放电,可编译到C#/Java/Go/JS/Python,社区活跃 | 需要端到端编译链证明的场景 |
| Verus | Rust | 代码级演绎 | Rust生态内最成熟的auto-active验证器,支持unsafe与并发模块化推理,AWS Nitro Enclaves/Asterinas生产使用,SOSP'24论文 | 需要长期稳定证明资产的场景(生态仍快速迭代) |
| SPARK 2014+GNATprove | Ada | 代码级演绎 | 工业成熟度最高,DO-178C认证背书,Eurofighter/Rolls-Royce/NVIDIA生产使用 | 需要提取代码到非Ada语言的场景 |
| Frama-C(WP/Eva) | C | 代码级演绎 | C语言生态中最成熟的演绎验证工具,WP霍尔逻辑+SMT全称+Eva抽象解释,法国核能/航空/汽车使用 | 需要并发证明的场景 |
| OpenJML | Java | 代码级演绎 | Java生态的auto-active验证器,JML注解+Z3/Coq后端,有Eclipse插件和VSCode扩展 | 大型Java项目/并发验证 |
| KeY | Java | 代码级演绎 | Java演绎式验证器,动态逻辑相继式+符号执行,验证了TimSort等复杂Java代码,开源GPLv2 | 大规模代码库验证 |
建议:
- 新项目选语言时,Rust + Verus 或 Dafny 是性价比最高的组合。
- 已有C代码想补验证,用 Frama-C。
- 已有Java代码想补验证,用 KeY(成熟)或 OpenJML(轻量)。
- 安全关键系统(航空/铁路),用 SPARK。
交互式定理证明器(能力最强,门槛最高)
适合:需要绝对正确性保证的核心组件,团队有形式化专家。
| 工具 | 语言 | 定位 | 推荐理由 | 明确不适用 |
|---|
| Coq | Gallina | 交互式定理证明 | 开源定理证明器中生态最成熟,CompCert/JavaCard EAL7/四色定理背书,可提取代码,工业背书强 | 大规模代码库日常验证 |
| Isabelle/HOL | Isabelle/ML | 交互式定理证明 | 库规模最大,seL4/AWS Nitro/WebAssembly验证,社区活跃 | 快速原型/小团队 |
| Lean 4 | Lean | 交互式定理证明+提取 | 新兴但势头最猛,微软+AWS背书,Mathlib库增长极快,兼具函数式编程语言和定理证明器特性 | 裸系统代码提取(GC问题) |
建议:
- 需要验证编译器/核心算法的绝对正确性 → Coq
- 数学/密码学/操作系统 → Isabelle
- 想跟进最新趋势、兼顾编程和证明 → Lean 4
模型检验 / 抽象建模(设计阶段首选)
适合:写代码之前验证设计/协议的结构性质。
| 工具 | 语言 | 定位 | 推荐理由 | 明确不适用 |
|---|
| TLA+/TLC/PlusCal/Quint | TLA+/PlusCal/Quint | 设计/协议级 | 分布式系统验证的事实标准,AWS六个关键系统/Azure Cosmos/Intel/Microsoft生产使用,唯一获此地位的模型检验工具,可证liveness | 代码级验证(只管设计层) |
| Alloy/Analyzer | Alloy | 设计/协议级 | 轻量级抽象建模,设计早期快速找反例,学习曲线低,可视化好,适合团队早期设计评审 | 需要代码级保证的场景 |
| SPIN/Promela | Promela | 设计/协议级 | 协议一致性与并发错误验证,NASA火星探测器/IEEE 802.11验证,ACM软件系统奖 | 代码级验证 |
建议:在写分布式系统/并发协议之前,先用 TLA+ 或 Alloy 建模验证设计,成本远低于写代码后再改。
按语言生态推荐
如果团队已经锁定某种编程语言,优先选该语言生态内的工具:
| 语言 | 首选工具 | 备选工具 | 说明 |
|---|
| C/C++ | CBMC(找bug)+ Frama-C(验证契约) | ESBMC | CBMC/ESBMC做有界模型检验找深层bug,Frama-C做契约验证 |
| Rust | Verus | Kani + Flux + StateRight | Verus做契约验证,Kani做零注解模型检验,Flux做精炼类型验证,StateRight做协议/并发模型检查 |
| Java | KeY | OpenJML | KeY成熟有工业案例,OpenJML轻量适合教学和小项目 |
| Go | Gobra(原型) | Perennial+Goose(学术) | Go生态形式验证较弱,Gobra是原型阶段;如果团队有Coq能力可用Perennial |
| OCaml | Gospel+Cameleer | coq-of-ocaml | Gospel+Cameleer适合日常契约验证,coq-of-ocaml适合需要绝对正确性的核心组件 |
| SML | Isabelle/HOL | HOL4/HOL Light | SML生态主要依赖外部定理证明器,Isabelle本身就用SML编写 |
| Ada | SPARK 2014+GNATprove | — | Ada生态最成熟的验证工具,DO-178C认证 |
| Haskell | LiquidHaskell | — | Haskell生态的精炼类型验证器,注解轻量、错误信息友好 |
| Scala | Stainless | — | Scala生态的auto-active验证器,基于SMT求解 |
综合推荐路径
根据实际项目阶段,推荐以下工具组合路径:
| 阶段 | 推荐工具组合 | 说明 |
|---|
| 快速发现bug(零成本) | CBMC/ESBMC(C/C++)、Kani(Rust)、Dialyzer(Erlang) | 零注解或低注解,CI集成即可跑 |
| 写新代码时边写边验证 | Dafny(独立语言)、Verus(Rust)、Frama-C(C)、KeY/OpenJML(Java) | 注解负担中等,自动化程度高 |
| 验证已有代码的正确性 | SPARK(Ada)、Frama-C(C)、Verus(Rust) | 对存量代码逐步补充契约 |
| 设计阶段验证协议/架构 | TLA+ / Alloy / SPIN | 写代码之前排除设计缺陷 |
| 需要绝对正确性的核心组件 | Coq / Isabelle / Lean 4 | 投入大但保证最强 |
黄金组合推荐
如果只能选几个工具组建团队工具链,以下是经过工业实践检验的"黄金组合":
| 场景 | 推荐组合 | 覆盖层次 |
|---|
| C/C++ 项目 | CBMC(有界模型检验找bug)+ Frama-C(契约验证)+ CompCert(编译链) | 代码级检验 → 代码级演绎 → 编译链 |
| Rust 项目 | Kani(零注解模型检验)+ Verus(契约验证)+ StateRight(协议模型检查) | 代码级检验 → 代码级演绎 → 设计层 |
| 分布式系统 | TLA+(协议设计)+ Kani/CBMC(实现检验) | 设计层 → 代码层 |
| 安全关键系统 | SPARK(代码验证)+ CompCert(编译链)+ Astrée(静态分析) | 代码演绎 → 编译链 → 抽象解释 |
| 编译器/内核 | Coq(核心证明)+ CompCert/CakeML(编译链)+ HOL4(二进制级) | 定理证明 → 编译链 → 二进制级 |
| 智能合约 | Certora(Solidity验证)+ Slither(静态分析) | 代码级演绎 |
| 硬件/RTL | JasperGold/Formality(RTL验证)+ Yosys+SymbiYosys(开源替代) | RTL签核 |
核心原则:没有银弹。工业上的实际形态都是组合——TLA+ 管设计 + Verus/SPARK 管 TCB + CBMC/Kani 扫 unsafe + herd7 管内存模型 + CompCert/二进制证明管编译链。根据项目阶段和团队能力,从低门槛工具入手,逐步向上迁移。
最高 ROI 集合小结:
- L1 设计层:
- 协议、状态机:TLA+, PlusCal, Quint, StateRight(Rust),TLA+ 最强大但也最难用
- 模型结构、规则:Alloy,需求分析、设计阶段早发现问题
- 精化式开发:Event-B
- L2 代码层·自动验证:Miri(Rust,运行时检查), RAPx(Rust,抽象解释,检查 unsafe),Kani(Rust),ESBMC,Flux(Rust)
- L3 代码层·演绎验证:Verus(Rust), Dafney
- L4 证明助理:Rocq, Lean 4