这是什么?适合谁?
frama-c-mcp(sysprog21/frama-c-mcp,15 Stars,MIT)是一个 MCP server,把 Frama-C 的形式化验证能力交给 AI Agent 驱动。Frama-C 是 C 代码静态分析的工业级框架,frama-c-mcp 让 Agent 能调用它的核心三件套:
- EVA:抽象解释,推导程序所有执行路径上的变量取值区间
- WP:演绎验证,把 C 代码 + ACSL 规约转成证明义务,交给 SMT 求解器证明
- ACSL 注解注入:自动生成/注入函数契约(前置/后置条件、循环不变式)到 C 源码
它的设计哲学写得很清楚:「server 是被 Agent 驱动的,不是被人驱动的」——没有给人敲的命令行,一切通过 MCP stdio 交互。核心工作流是一个迭代循环:提出注解 → 证明它 → 读失败目标的原因 → 修订。项目会话跨调用保持(一次加载整个项目),沙箱按名字寻址,证明回执只在同一次运行内比较。
架构是三层:AI Agent ⇄(MCP stdio)⇄ Rust MCP server ⇄(Unix socket)⇄ Frama-C 主进程 + 每个实验一个独立的 Frama-C 沙箱(create_sandbox 会把目标函数连同其类型、被调用者、全局依赖抽到临时 C 文件再开独立进程跑验证)。还有一个 check 子命令供 CI 使用——这是唯一为人设计的入口。
出品方是 sysprog21(台湾系统程式社群,Linux 核心与系统能力培养营的社群组织),在 C 语言工程教育深耕多年,C 代码正确性验证方向国内罕见。
适合人群:
- 安全关键 C 代码(内核模块/固件/工控)的工程师:想给 AI 生成代码上「数学证明」保险
- 形式化方法学习者:用 Agent 对话的方式入门 Frama-C/EVA/WP
- 编译器/静态分析研究者:把 Frama-C 接入 LLM 工作流做混合验证实验
不适合:非 C 语言项目;想「一键全自动证明」的用户(证明循环仍需人盯失败目标);Windows 原生环境(Frama-C 生态以 Linux 为主)。
使用前提:Linux + opam 环境 + Frama-C 与配套 ast-utils 插件(同 opam switch);Rust 工具链(构建 server)。
准备工作
- Frama-C:通过 opam 安装(如
opam install frama-c),与ast-utils插件装在同一 switch。 - Rust 工具链:
rustup,用于构建 MCP server。 - MCP 客户端:Claude Code / Claude Desktop 等。
- 成本:全部开源免费;消耗自己 LLM tokens。
- 时间预算:环境搭建 30-60 分钟(opam 依赖编译较久);上手验证第一个函数约 15 分钟。
快速上手(3 步)
第一步:环境就绪
# opam 环境 + Frama-C + ast-utils(同 switch)
opam install frama-c
# 构建 MCP server
cargo build --release
第二步:接入 MCP 客户端
在 Claude Code / Claude Desktop 配置中添加 frama-c-mcp(stdio 传输),指向构建出的二进制。
第三步:跑第一个证明循环
对 Agent 说(英文 prompt 效果最佳):
Load the project in ./src, pick function parse_header,
write a function contract in ACSL (requires/ensures),
and prove it with WP. Report which goals fail and why.
预期结果:Agent 加载项目 → 注入 ACSL 注解 → 调 WP 证明 → 拿到失败目标清单与原因 → 修订注解再证,最终报告「全目标闭合」或剩余风险。
常见踩坑
踩坑 1:Frama-C/ast-utils 版本不匹配
- 现象:server 起动后工具调用报协议错误。
- 原因:
ast-utils插件与 Frama-C 版本必须同 switch 配套。 - 解决:严格按仓库文档在同一 opam switch 安装两者。
踩坑 2:沙箱抽取漏依赖
- 现象:沙箱里证明结果与主项目不一致。
- 原因:
create_sandbox按依赖分析抽取函数及其类型/被调用者/全局依赖,复杂全局状态可能抽取不全。 - 解决:先用 EVA 在主项目跑一遍取值信息,再开沙箱;复杂函数直接在主项目验证。
踩坑 3:循环不变式写不出
- 现象:WP 对循环体目标全部失败。
- 原因:ACSL 循环不变式是证明闭合的关键也是最难写的部分。
- 解决:让 Agent「先证不含循环的版本,再逐步加不变式」,渐进式逼近。
踩坑 4:SMT 求解器超时
- 现象:证明目标 pending 不返回。
- 原因:默认求解器(Alt-Ergo/Z3 等)对复杂目标耗时。
- 解决:增加超时预算、分拆目标、或提示 Agent 弱化注解分步证。
踩坑 5:证明回执跨运行比较
- 现象:两次运行的回执对不上。
- 原因:设计上 proof receipts 只在同一次 run 内可比。
- 解决:以「一次 run 内的目标闭合率」为进度指标,别跨 run 对账。
踩坑 6:把 EVA 和 WP 混着用却期待相同结论
- 现象:EVA 说区间 OK、WP 说证明失败,困惑。
- 原因:两者机制不同——EVA 是过近似分析(可能误报),WP 是精确证明义务(可能因注解不足失败)。
- 解决:工作流上先 EVA 探路(找可疑点)再 WP 证明(下结论)。
初级用法
- 单函数契约验证:挑一个纯函数(无副作用),让 Agent 写 requires/ensures 并证明——15 分钟体验完整闭环。
- EVA 取值探路:对可疑函数跑 EVA,让 Agent 解读变量区间报告,标出潜在除零/越界。
- 注解体检:对已有 ACSL 注解的代码,让 Agent 检查注解是否真的能证(防止「写了但证不了」的装饰性注解)。
- CI 集成:用
check子命令把「注解可证明」纳入 CI 门禁。
高级玩法
- AI 写代码 + AI 证明代码:让 Agent 先实现一个 C 函数,再用同一会话生成契约并证明——「生成即验证」的完整流水线。
- 反例驱动开发:WP 失败目标本身就是反例线索,让 Agent 据此修代码或补约束,迭代收敛。
- 内核代码审计:对开源内核模块(如 Linux 驱动片段)做 EVA+WP 混合分析,产出「数学证据支撑」的审计报告。
- 教学场景:让 Agent 出题(带 bug 的 C 函数)+ 学员用 Agent 辅助写注解定位 bug——形式化方法教学的新形态。
小技巧
- 英文 prompt:README 明确说「prompt in English」,工具描述与提示模式按英文打磨。
- 一个项目一个会话:会话状态跨调用保持,别在同一个 server 实例里混多个项目。
- 先简后繁:从纯函数到带循环函数再到指针操作,注解难度陡增。
- 读失败原因再动手:WP 的失败 goal 输出是修订注解的金矿,别急着换思路。
- opam 慢就预热:依赖编译期间正好读 Frama-C 文档。
常见问题 FAQ
Q1:它能自动证明任意 C 代码正确吗?
A:不能。它提供的是「Agent 驱动的证明循环」:注解仍需设计(Agent 提案、人可干预),不可判定性决定了没有全自动保证。来源:README
Q2:支持 C++ 吗?
A:Frama-C 生态聚焦 C;C++ 支持有限(模板等基本不可用)。
Q3:为什么设计成「Agent 驱动、无人命令」?
A:迭代证明循环(提议-证明-读失败-修订)天然是多轮对话形态,LLM Agent 是最合适的驱动者;人只需 CI 里的 check。来源:README
Q4:能找内存安全漏洞吗?
A:EVA+WP 组合可证内存安全性(如某指针访问永不出界),前提是注解写到位;比 fuzzing 给出的是更强的确定性结论。
Q5:和 CBMC/KLEE 类工具有何区别?
A:CBMC 是有界模型检查、KLEE 是符号执行——都给出反例但覆盖有界;Frama-C WP 是无界演绎证明(配好注解可证全路径),定位互补。
进阶学习建议
- 吃透「沙箱」设计:读 README Architecture 一节,理解
create_sandbox如何把函数+依赖抽到隔离环境做实验——这个「以函数为单位的验证沙箱」模式,是大规模项目里控制验证爆炸半径的关键技巧。 - 练 ACSL 注解的渐进式写法:从
ensures \result == x*y级别的朴素契约,到循环不变式、谓词抽象,逐步加码;让 Agent 每次只加一条注解并跑证明,你会直观看到每条注解闭合了哪些 goal。 - 关注 sysprog21 生态:出品方是台湾系统程式社群,周边有大量 C 语言工程与验证教学资源,适合作为中文母语者入门形式化方法的支点。
参考链接
免责声明:本文基于官方仓库 README 与 GitHub 公开数据整理,AI 辅助生成,MagicNetWorld 尚未完成独立实测。形式化验证环境的搭建与使用有较高门槛,请以官方文档为准。
📊 评分与标签
评分说明
总分 7.6/10 · S_入选
📊 可观测社区指标(采集日期:2026-08-24)
- GitHub: sysprog21/frama-c-mcp ★15,🔱2
- 协议:MIT;实现:Rust MCP server + Frama-C + ast-utils 插件
- 活跃度:最近推送 2026-08-20(采集前 4 天),仓库创建 2026-08-19(5 天)
- 出品方:sysprog21(台湾系统程式社群,长期深耕 C 语言工程教育)
⚙️ 功能完整度 1.9/2.5
- 覆盖 Frama-C 三大核心:EVA 抽象解释、WP 演绎证明、ACSL 注解注入;隔离沙箱(create_sandbox 抽取函数+依赖)、跨调用会话状态、CI check 子命令
- 来源:README
- 形式化验证的完整循环(提议-证明-读失败-修订)已闭环;但仅限 C,C++/其他语言不覆盖
- 竞品对比 1(CBMC/KLEE MCP 化尝试):有界验证给反例,无演绎证明;frama-c-mcp 走无界证明路线
- 竞品对比 2(Frama-C 手动使用):能力等同但交互是专家向 CLI;MCP 化把使用门槛转移给 Agent
✨ 输出质量 2.0/2.5
- 证明结果由 SMT 求解器背书(数学结论而非概率判断),失败目标带原因输出——这是 LLM 时代稀缺的确定性证据源
- 输出质量上限受注解质量制约(注解不足则证明失败),Agent 驱动部分缓解但未消除
- 竞品对比 1(LLM 自查代码):概率性判断会漏;形式化证明闭合即确定
- 竞品对比 2(静态扫描工具):误报率高且无证明;Frama-C WP 误报为零(要么证出要么报失败)
🖐️ 易用性 0.8/1.5
- 「Agent 驱动、无人命令」的设计理念先进,但前置环境重:opam + Frama-C + ast-utils 同 switch + Rust 构建,Linux 优先,安装成本在 MCP 工具里属最高档
- 竞品对比 1(纯云 API 工具):零安装;frama-c-mcp 本地重型依赖
- 竞品对比 2(单二进制 MCP server):形态更轻;本项目是「框架接入器」而非独立工具
💰 性价比 1.5/1.5
- 全链路开源免费(MIT + Frama-C 开源生态);商业形式化验证服务(如部分 SMT 云服务)价格高昂
- 竞品对比 1(商业静态分析):授权费高;本组合 $0
- 竞品对比 2(人工形式化验证专家):人力成本极高;Agent 辅助显著提速注解编写
🔒 稳定性 0.5/1.0
- 仓库 2026-08-19 创建(5 天)、15 stars,极早期;底层 Frama-C 是多年工业级成熟框架,风险集中在 Rust 包装层与沙箱抽取逻辑
- 竞品对比 1(直接用 Frama-C):上游成熟稳定;MCP 层是新代码
- 竞品对比 2(其他学术 MCP 包装):同样早期;本项目有社群组织(sysprog21)背书略优
🛡️ 隐私安全 0.9/1.0
- 全本地运行(LLM 调用除外),代码不出机器——对安全关键代码审计场景是刚需属性
- 竞品对比 1(云端代码分析):源码上云;本工具代码本地
- 竞品对比 2(IDE 插件类分析器):多数也本地,但遥测策略各异;本工具无遥测
评分依据可追溯至公开来源,每项分数均有明确理由和数据支撑。
🏷️ 标签说明
- AI编程: 定位是让 AI Agent 驱动 C 代码验证的编程工具。来源:README
- 开源免费: MIT 协议,Frama-C 亦开源。来源:GitHub API
- MCP: MCP server(stdio),专为 Agent 驱动设计。来源:README
- 形式化验证: 核心能力是 EVA 抽象解释与 WP 演绎证明。来源:README
- C语言: 验证对象限定 C 代码(Frama-C 生态边界)。来源:Frama-C 官网
📋 来源核实
- ✅ GitHub API 已验证: sysprog21/frama-c-mcp - Stars 15, Forks 2, pushed 2026-08-20, created 2026-08-19, MIT(2026-08-24 采集)
- ✅ README 已读取: EVA/WP/ACSL 三能力、三层架构图、沙箱机制、Agent 驱动设计哲学、CI check 均核对
- ⚠️ 未实测: 未搭建 opam/Frama-C 环境实际运行;沙箱抽取与证明循环的实际体验未验证
- ⚠️ 注意: 项目 5 天历史,star 数低但方向稀缺(C 形式化验证 × MCP 基本无同类)
⚠️ 局限与未实测声明
- 本文基于 GitHub API 与官方 README 于 2026-08-24 采集
- 安装流程(opam 依赖耗时)与证明循环体验未实测;易用性维度按环境门槛保守评估
- sysprog21 社群背景基于其 GitHub 组织公开信息
同分类推荐
AI编程 分类下的其他工具