[论文] 将大规模 C 代码库翻译为惯用 Rust
发布: (2025年11月26日 GMT+8 02:42)
7 min read
原文: arXiv
Source: arXiv - 2511.20617v1
概览
本文介绍了 Rustine,一个端到端的流水线,能够自动将整个 C 代码库翻译成 惯用且安全的 Rust。通过结合轻量级静态分析和有针对性的代码生成,Rustine 在简单转译器的可扩展性与手工 Rust 重写的高质量之间架起了桥梁,使得在真实项目中进行大规模迁移成为可能。
关键贡献
- 全自动的仓库级翻译,适用于从几十行到超过一万行代码的 C 项目。
- 高功能等价性:平均 87 % 的测试断言通过(1,063,099 / 1,221,192),函数级覆盖率为 74.7 %,行级覆盖率为 72.2 %。
- 安全优先的输出:生成的 Rust 中原始指针、指针算术和
unsafe块的数量明显少于已有工具。 - 惯用 Rust:翻译结果在 Rust linter(clippy)检查中的得分更高,代码更符合 Rust 开发者的使用习惯。
- 开发者在环调试:当未达到完整测试套等价时,工程师可以利用 Rustine 的诊断信息在约 4.5 小时内完成迁移。
- 全面的实证评估:在 23 个多样化程序上与六种现有的 C‑to‑Rust 翻译器进行对比。
方法论
Rustine 的流水线由三个松耦合阶段组成:
- 静态 C 分析与抽象 – 轻量级前端解析 C AST,提取类型信息,并构建捕获内存布局、控制流和 API 边界的中间表示(IR),无需调用大型语言模型。
- 基于模式的 Rust 合成 – 将 IR 输入规则驱动的生成器,映射 C 构造到对应的 Rust 实现。生成器倾向使用安全抽象(如 slice、
Vec、Option),仅在无法安全表达时才插入unsafe(例如 FFI)。 - 生成后精炼 – 将原始 Rust 输出通过 Clippy 和 rustfmt,随后利用测试驱动的反馈回路自动重写失败的代码片段(例如通过调整生命周期或将指针算术替换为安全迭代器模式)。
整个过程在普通硬件上运行;不需要大型语言模型,成本低廉且仍能生成可编译的代码。
结果与发现
- 编译成功:所有翻译后的仓库均可在无需人工修改的情况下编译。
- 功能等价:平均 87 % 的原始测试断言成立,覆盖率与原 C 代码相当。
- 安全指标:Rustine 的输出将原始指针使用量降低约 68 %,基本消除指针算术,相比最佳已有工具将
unsafe块数量削减超过一半。 - 惯用性:Clippy 警告从基线工具的每千行约 12 条下降至 Rustine 输出的每千行约 3 条。
- 人工工作量:当自动化阶段未通过时,开发者利用 Rustine 的诊断信息定位并修复剩余问题约需 4.5 小时——相比完整手动重写的数周时间大幅缩短。
总体而言,Rustine 在安全性、可读性和功能正确性方面均优于六种现有的仓库级翻译器。
实际意义
- 加速迁移:拥有遗留 C 库(如网络协议栈、嵌入式驱动)的公司现在可以在数小时内生成可靠的 Rust 基线,而非数月,从而降低采用 Rust 内存安全保障的门槛。
- 成本效益的安全加固:由于 Rustine 不依赖昂贵的 LLM 推理,可集成到 CI 流水线,实现对新提交的 C 代码持续 “Rust 化”,帮助团队及早捕获不安全模式。
- 更好的新人培训:惯用的 Rust 输出更易于 Rust 开发者阅读和维护,降低了从 C 转向 Rust 的学习曲线。
- 工具链可扩展性:Rustine 的规则生成器可针对特定领域 API(如 OpenGL、POSIX)进行定制,实现有针对性的迁移,而无需重写整个流水线。
- 开源潜力:若将流水线开源,社区可以共同构建翻译模式库,进一步提升对晦涩 C 习惯用法的覆盖率。
局限性与未来工作
- 部分功能等价:平均仍有 13 % 的测试断言失败,主要源于静态分析无法完整建模的未定义行为边缘情况。
- 对宏重度代码的处理有限:虽然 Rustine 能解析大多数宏,但高度元编程的 C(如 Linux 内核风格)可能仍需人工干预。
- 缺乏自动性能调优:生成的 Rust 代码安全可靠,但并非总是最优;未来工作可引入基于性能分析的重写,以匹配或超越原 C 的性能。
- 扩展到其他语言:作者计划将相同流水线应用于 C++ 和 Objective‑C 代码库,以扩大 Rustine 的适用范围。
尽管存在上述不足,Rustine 已经证明大规模、自动化的 C‑to‑Rust 迁移在技术上可行,并对现代软件工程团队具有实用价值。
作者
- Saman Dehghan
- Tianran Sun
- Tianxiang Wu
- Zihan Li
- Reyhaneh Jabbarvand
论文信息
- arXiv ID: 2511.20617v1
- 分类: cs.SE, cs.PL
- 发布日期: 2025 年 11 月 25 日
- PDF: Download PDF