Translating C code into safe Rust is an effective way to ensure its memory safety. Compared to rule-based translation which produces Rust code that remains largely unsafe, LLM-based methods can generate more idiomatic and safer Rust code because LLMs have been trained on vast amount of human-written idiomatic code. Although promising, existing LLM-based methods still struggle with project-level C-to-Rust translation. They typically partition a C project into smaller units (\eg{} functions) based on call graphs and translate them bottom-up to resolve program dependencies. However, this bottom-up, unit-by-unit paradigm often fails to translate pointers due to the lack of a global perspective on their usage. To address this problem, we propose a novel C-Rust Pointer Knowledge Graph (KG) that enriches a code-dependency graph with two types of pointer semantics: (i) pointer-usage information which record global behaviors such as points-to flows and map lower-level struct usage to higher-level units; and (ii) Rust-oriented annotations which encode ownership, mutability, nullability, and lifetime. Synthesizing the \kg{} with LLMs, we further propose \ourtool{}, which implements a project-level C-to-Rust translation technique. In \ourtool{}, the \kg{} provides LLMs with comprehensive pointer semantics from a global perspective, thus guiding LLMs towards generating safe and idiomatic Rust code from a given C project. Our experiments show that \ourtool{} reduces unsafe usages in translated Rust by 99.9\% compared to both rule-based translation and traditional LLM-based rewriting, while achieving an average 29.3\% higher functional correctness than those fuzzing-enhanced LLM methods.
academicProject-Level C-to-Rust Translation via Synergistic Integration of Knowledge Graphs and Large Language Models
- 论文ID: 2510.10956
- 标题: Project-Level C-to-Rust Translation via Synergistic Integration of Knowledge Graphs and Large Language Models
- 作者: Zhiqiang Yuan, Wenjun Mao, Zhuo Chen, Xiyue Shang, Chong Wang, Yiling Lou, Xin Peng
- 分类: cs.SE (Software Engineering), cs.AI (Artificial Intelligence)
- 发表时间: 2025年10月13日
- 论文链接: https://arxiv.org/abs/2510.10956
将C代码翻译为安全的Rust代码是确保内存安全的有效方法。与产生大量不安全代码的基于规则的翻译方法相比,基于大语言模型(LLM)的方法能够生成更加惯用和安全的Rust代码。然而,现有的LLM方法在项目级C到Rust翻译中仍然存在困难,特别是在处理指针时缺乏全局视角。为解决这一问题,本文提出了一种新颖的C-Rust指针知识图谱(KG),该图谱通过两种指针语义丰富了代码依赖图:(1)记录全局行为的指针使用信息;(2)编码所有权、可变性、可空性和生命周期的Rust导向注释。基于此知识图谱,提出了PTRMAPPER技术,实现了项目级C到Rust翻译。实验表明,PTRMAPPER相比基于规则和传统LLM方法减少了99.9%的不安全代码使用,并在功能正确性上平均提高了29.3%。
C语言广泛应用于操作系统、嵌入式系统和性能关键应用中,但其手动内存管理和直接指针操作经常导致缓冲区溢出、内存泄漏等安全漏洞。Rust作为现代替代方案,在保持C语言性能的同时确保内存安全。因此,将遗留C代码自动翻译为Rust成为迫切需求。
- 基于规则的方法:依赖预定义规则,产生的Rust代码大量使用unsafe块、原始指针和外部函数调用,仍存在安全风险
- 现有LLM方法:采用自底向上的单元翻译范式,缺乏全局指针使用视角,经常在指针翻译中出现定义-使用冲突
C和Rust在指针使用上存在根本差异:
- C语言:指针高度灵活,定义时仅指定类型,使用时可自由读写修改
- Rust语言:指针使用严格受限,定义时必须明确所有权、可变性和生命周期,使用时必须严格遵守借用检查器规则
- 提出了新颖的C-Rust指针知识图谱(KG):能够从项目级上下文全面建模代码单元依赖、指针使用信息和Rust导向注释
- 设计了PTRMAPPER项目级翻译技术:利用C-Rust指针KG与LLM协同,将C项目翻译为安全惯用的Rust代码
- 实现了显著的性能提升:生成更惯用、更安全、正确性更高的Rust代码
- 提供了全面的实验验证:消融实验证明了指针使用信息和Rust导向注释对提升翻译性能的重要性
给定一个C项目,自动将其翻译为功能等价、内存安全且惯用的Rust项目。输入为C源码文件集合,输出为可编译运行的Rust项目。
PTRMAPPER包含三个主要阶段:
知识图谱模式设计:
- 代码依赖图:描述代码单元(函数、结构体、枚举等)间的依赖关系
- 指针使用信息:捕获项目级指针行为,包括:
- 实体:Param(参数)、Value(返回值)、Member(成员)、Pointer(指针)等
- 关系:derivesFrom(派生关系)、mayAlias/noAlias(别名关系)、pointsTo(指向关系)等
- Rust导向注释:包含所有权、可变性、可空性、生命周期等语义
构建过程:
- 代码依赖图提取:使用静态分析提取代码单元及其依赖关系
- 指针使用信息提取:采用上下文敏感、字段敏感的分析策略
- Rust导向注释提取:基于预定义规则分析指针生命周期并注释相应语义
翻译单元识别与排序:
- 使用Tarjan算法检测强连通分量(SCC)
- 将每个SCC作为独立翻译单元
- 拓扑排序确定自底向上的翻译顺序
指针语义提取:
为每个翻译单元从KG中提取相应的指针语义知识,以<实体1, 关系, 实体2>三元组形式提供给LLM。
增量翻译与验证:
- 将翻译单元、指针语义知识和已翻译Rust上下文整合到翻译提示中
- 每个翻译单元生成后立即集成到Rust项目并编译验证
- 如出现错误则触发错误修正机制
利用Rust版本的指针KG为LLM提供项目级语义上下文:
- 依赖关系帮助精确识别错误相关的代码单元
- Rust导向注释提供精确的程序语义指导有效修复
- 全局指针语义建模:首次将项目级指针使用信息和Rust特定语义集成到知识图谱中
- 协同翻译范式:结合知识图谱的全局视角与LLM的生成能力
- 增量验证机制:及时发现并修正错误,防止错误累积
- 智能错误修正:基于KG的语义信息而非仅依赖编译器错误信息
使用CROWN数据集中的16个真实C项目,代码行数从154到14,829不等,包括:
- avl, buffer, genann, quadtree, rgba, urlparser等小型项目
- bzip2, heman, lodepng等大型项目
为评估功能等价性,手动构建了单元测试,实现了81.4%-97.7%的行覆盖率和92.9%-100.0%的函数覆盖率。
惯用性评估:
- Lint Alert Count:使用Rust-Clippy统计非惯用代码警告数量
- Unsafe Usage Count:使用Cargo-geiger统计unsafe代码使用次数
正确性评估:
- Compiled:编译成功的函数比例
- Equiv.:通过单元测试的函数比例
- 惯用性对比:CROWN(基于规则)、PR2(LLM重写)
- 正确性对比:FLOURINE(模糊测试增强的LLM方法)
- 消融实验:PTRTRANSPS、PTRTRANSPU、PTRTRANSRA、PTRTRANSEC等变体
- LLM:ChatGPT-4o,temperature=0
- 静态分析:Clang、Doxygen、SVF框架
- 错误修正:最多5次迭代
- 编译验证:cargo check
惯用性显著提升:
- 相比CROWN:Lint警告减少94.9%(6,802→349),unsafe使用减少99.9%(141,866→85)
- 相比PR2:Lint警告减少91.8%(4,272→349),unsafe使用减少99.9%(134,185→85)
正确性大幅改善:
- 相比FLOURINE:编译成功率提升28.4%(98.3% vs 69.9%),功能等价率提升29.3%(81.6% vs 52.3%)
- 小型项目(avl, rgba, ht, bst)实现100%功能等价
消融实验验证了各组件的重要性:
- 无指针语义(PTRTRANSPS):等价率从81.6%降至59.5%,下降22.1%
- 仅指针使用信息(PTRTRANSRA):性能不如完整版本
- 仅Rust注释(PTRTRANSPU):同样性能下降
- 无错误修正(PTRTRANSEC):等价率从81.6%降至50.8%,下降30.8%
PTRMAPPER在不同复杂度下表现稳定:
- 代码行数:随复杂度增加性能稳定,FLOURINE急剧下降
- 依赖关系:依赖数[16,44)时等价率57.1%,FLOURINE为0%
- 指针数量:指针数[20,50)时等价率50.0%,FLOURINE为0%
以Quadtree项目为例,展示了PTRMAPPER如何解决复杂的借用冲突:
- 识别
tree参数应为不可变借用&Quadtree - 分离
root为可变借用&mut QuadtreeNode - 提取
key_free为独立参数避免借用冲突 - 正确处理所有权语义
- 基于规则的方法:Corrode、C2RUST等,产生大量unsafe代码
- LLM基础方法:SPECTRA、FLOURINE等,缺乏全局视角
- 单元翻译方法:SYZYGY等,存在指针语义丢失问题
- 首次系统性地建模项目级指针语义
- 结合静态分析与LLM生成的协同方法
- 显著提升安全性和正确性
- C-Rust指针知识图谱有效解决了项目级翻译中的指针语义丢失问题
- 协同集成静态分析和LLM显著提升翻译质量
- 增量验证和智能错误修正机制确保翻译可靠性
- 构建开销:知识图谱构建需要额外的静态分析时间
- 规则依赖:Rust注释提取依赖预定义规则,可能存在覆盖不全
- 项目规模:超大型项目的可扩展性有待验证
- 手动干预:复杂情况下仍可能需要少量手动调整
- 优化知识图谱构建效率
- 扩展到更多编程语言对
- 集成更多程序分析技术
- 提升自动化程度
- 创新性强:首次将知识图谱与LLM结合用于代码翻译,解决了现有方法的根本问题
- 方法系统:从问题分析到解决方案设计都很完整,技术路线清晰
- 实验充分:16个真实项目、多种对比方法、详细的消融实验
- 效果显著:在安全性、惯用性、正确性三个维度都取得显著提升
- 实用价值高:解决了实际的工程问题,有很强的应用前景
- 可扩展性问题:静态分析的计算复杂度可能限制在超大项目上的应用
- 规则完备性:Rust注释提取规则可能无法覆盖所有边界情况
- 评估局限:主要在中小型项目上验证,大型项目的表现有待进一步验证
- 依赖质量:方法效果很大程度上依赖于静态分析的准确性
- 学术贡献:为代码翻译领域提供了新的研究范式,结合了程序分析和生成式AI
- 工程价值:为C到Rust迁移提供了实用工具,有助于提升软件安全性
- 技术启发:知识图谱引导LLM的思路可推广到其他代码生成任务
- 遗留系统迁移:适合需要将C代码库迁移到Rust的项目
- 安全关键应用:对内存安全要求高的系统开发
- 自动化工具:可集成到IDE或CI/CD流水线中
- 教育培训:帮助开发者学习Rust的内存安全概念
论文引用了76篇相关文献,涵盖了代码翻译、程序分析、大语言模型等多个领域的重要工作,为研究提供了坚实的理论基础。
总体评价:这是一篇高质量的软件工程研究论文,创新性地结合了知识图谱和大语言模型来解决C到Rust翻译中的关键问题。方法设计合理,实验验证充分,结果令人信服。虽然存在一些局限性,但为代码翻译领域开辟了新的研究方向,具有重要的学术价值和实用意义。