C 驱动分析libclang AST数据流 / 污点确定性生成Linux / 裸机 / 用户态
reharness 是 DRI 翻译论文(~/Code/dri-trans-paper/reharness)的核心系统:从 Linux C 设备驱动中提取形式化的寄存器交互序列(RIS),推断后端无关的设备语义,并确定性生成 userspace harness、bare-metal C 和 Linux 内核模块三种目标。
Top 并阻止 strict readiness,绝不静默丢失访问,绝不用 stub 伪装成功。op_id、源码位置、reliability 和地址/值/路径精度,论文数字全部来自机器可读 JSON。op_id + digest 的 lowering receipt,独立 oracle 做 exactly-once 校验。libclang 解析 TU,自动读取 Kbuild .o.cmd 或 compile_commands.json 还原编译参数(include 路径、宏定义),保证 AST 与真实内核构建一致。
收集驱动源码里的寄存器偏移宏(如 #define GPIOIE 0x410),常量求值(_eval_int_expr),供地址解析使用。
找出本文件定义的函数、回调入口(probe/irq_handler/ops 表成员…)、MMIO 全局变量。
按源码顺序遍历调用,把包装函数(如 pl061_write 调 writeb)过程间内联,深度上限 max_inline_depth=3;间接调用目标(callback 表)静态解析。
维护抽象存储 var → AbsVal,把 MMIO 调用的地址参数解析成 RegAddr(Fixed/Symbolic/Computed),检测 read-modify-write 模式,记录分支条件栈。
把扁平 Op 流嵌套成 Cond 块、把值字符串解析进 Expr 代数、打上 op_id / evidence / precision / reliability,输出 .ris 与 FormalRIS JSON。
推断寄存器表、状态、资源、callback 绑定、effect/ensure 契约,输出后端无关的 .dspec。
按 .bind 的类型/函数映射,把 FormalRIS lowering 成 harness / baremetal / linux C;每个访问带 lowering receipt。
编译、generation contract 校验、原生 trace、QEMU 运行时比对、strict readiness 评分。
| 目录 | 内容 | 规模 |
|---|---|---|
src/extractor/ | 分析管线:AST 模型、宏、调用图、数据流、污点、MMIO 分类、事务、控制流、SVF 别名、形式化、语义推断 | ~15,600 行 |
src/generator/ | 三后端生成器 + 共享 lowering | ~4,900 行 |
src/experiment_*.py / synthesis.py / trace_protocol.py | 实验编排(manifest → runner)、LLM 合成桥、trace 协议 | ~2,000 行 |
qa/ | 测试套件 + 独立 oracle(AST、registration、clock、mutation、trace)+ 矩阵运行器 | 205 项测试 |
benchmarks/ | 19 个 baseline 单源驱动 + 多源 manifest + zero-shot holdout | 19 + 3 多源 + 12 holdout |
docs/ | 架构文档、里程碑(C10–C27)、复盘 | 40+ 篇 |
tools/pi/ | Pi coding-agent 合成器及本地 Node 依赖 | — |
platform/ | 固定内核 submodule 构建 + 测试 rootfs | — |
research/ | 论文、版本化实验结果、known-good artifacts | — |
| 指标 | 值 |
|---|---|
| 驱动数 / 总 ops | 19 驱动 / 485 个 RIS MMIO 操作 |
| 地址分类 | Symbolic 366 · Fixed 64 · Computed 41 |
| RMW / 条件 / 循环 / 寄存器 | 73 / 123 / 25 / 157 |
| 三后端编译 | harness 19/19 · bare-metal 19/19 · Linux 18/19 |
| QEMU 运行时 | edu 值级 oracle ✅ · gpio-ftgpio010 结构化 Formal RIS ✅ |
git submodule update --init
./tools/build/prepare_kernel.sh build
./run.sh test # 全量测试
./run.sh extract benchmarks/drivers/baseline/edu.c artifacts/output/edu.ris
./run.sh spec benchmarks/drivers/baseline/edu.c artifacts/output/edu.dspec
./run.sh gen benchmarks/drivers/baseline/edu.c linux artifacts/output/edu_drv.c
./run.sh driver benchmarks/drivers/baseline/edu.c artifacts/output/edu
./run.sh experiment benchmarks/experiments/edu.json # manifest 驱动的闭环实验
| 章节 | 内容 |
|---|---|
| ① RIS 形式语言 | .ris 语法、表达式代数、地址分类、操作类型、reliability 体系 —— 用 edu / pl061 真实产物逐行讲解 |
| ② 提取器实现 | AST 模型 → 宏表 → 调用图内联 → 数据流/污点 → MMIO 分类 → 形式化,逐模块讲代码 |
| ③ 语义推断 | DeviceSpec / FactsSpec / callback 绑定 / 子系统摘要 / 多源合并 |
| ④ 三后端生成器 | .bind 绑定、generation contract、lowering receipt、harness / baremetal / linux 发射细节 |
| ⑤ 验证与实验体系 | 实验 manifest/runner、trace 协议、oracle 家族、QEMU、strict readiness、复现流程 |