CRUST-Bench: A Comprehensive Benchmark for C-to-safe-Rust Transpilation
作者: Anirudh Khatry, Robert Zhang, Jia Pan, Ziteng Wang, Qiaochu Chen, Greg Durrett, Isil Dillig
分类: cs.SE, cs.CL, cs.LG
发布日期: 2025-04-21 (更新: 2025-10-01)
备注: To be published at COLM, 2025
🔗 代码/项目: GITHUB
💡 一句话要点
CRUST-Bench:一个全面的C到安全Rust转译基准测试,促进遗留C代码的安全迁移。
🎯 匹配领域: 支柱九:具身大模型 (Embodied Foundation Models)
关键词: C到Rust转译 基准测试 代码迁移 内存安全 大型语言模型 软件现代化 代码安全性 Rust语言
📋 核心要点
- 现有C到Rust转译缺乏统一的评估标准,难以衡量转译系统的安全性和正确性,阻碍了相关技术发展。
- CRUST-Bench提供包含100个C代码仓库的数据集,每个仓库都配有安全Rust接口和测试用例,用于评估转译系统的性能。
- 实验表明,即使是最先进的LLM在CRUST-Bench上表现仍然不佳,表明C到安全Rust的自动转译仍面临巨大挑战。
📝 摘要(中文)
C到Rust的转译对于现代化遗留C代码,同时增强其安全性以及与现代Rust生态系统的互操作性至关重要。然而,目前尚不存在用于评估系统是否可以将C代码转译为可以通过一系列测试用例的安全Rust代码的数据集。我们推出了CRUST-Bench,一个包含100个C代码仓库的数据集,每个仓库都配有手动编写的安全Rust接口以及可用于验证转译正确性的测试用例。通过考虑整个代码仓库而不是孤立的函数,CRUST-Bench捕捉了翻译具有跨多个文件依赖关系的复杂项目所面临的挑战。提供的Rust接口提供了明确的规范,以确保遵循符合语言习惯的、内存安全的Rust模式,而随附的测试用例则强制执行功能正确性。我们评估了最先进的大型语言模型(LLM)在此任务上的表现,发现安全且符合语言习惯的Rust生成对于各种最先进的方法和技术来说仍然是一个具有挑战性的问题。我们还深入了解了LLM在将代码从C转译为安全Rust时通常会犯的错误。性能最佳的模型OpenAI o1在单次尝试设置中仅能解决15个任务。CRUST-Bench的改进将带来改进的转译系统,这些系统可以推理复杂的场景,并帮助将遗留代码库从C迁移到像Rust这样的确保内存安全的语言。
🔬 方法详解
问题定义:论文旨在解决C到安全Rust自动转译的评估问题。现有方法缺乏一个全面的基准测试,无法有效评估转译系统的安全性、正确性和代码风格。这使得研究人员难以比较不同转译方法,也难以衡量现有方法在实际应用中的效果。现有方法通常只关注孤立的函数,而忽略了大型项目中复杂的依赖关系和接口规范。
核心思路:论文的核心思路是构建一个包含真实C代码仓库、手动编写的安全Rust接口和测试用例的综合性基准测试集。通过评估转译系统在整个代码仓库上的性能,可以更全面地衡量其在处理复杂依赖关系、生成符合语言习惯的安全Rust代码方面的能力。手动编写的Rust接口提供了明确的规范,确保转译后的代码符合Rust的最佳实践。
技术框架:CRUST-Bench数据集包含100个C代码仓库,每个仓库都包含以下组件:原始C代码、手动编写的安全Rust接口、以及用于验证转译正确性的测试用例。评估流程包括:使用待评估的转译系统将C代码转换为Rust代码;将生成的Rust代码与手动编写的Rust接口进行比较,评估其代码风格和安全性;运行测试用例,验证转译后的代码的功能正确性。
关键创新:CRUST-Bench的关键创新在于其综合性和真实性。它不仅包含大量的C代码仓库,而且还提供了手动编写的安全Rust接口和测试用例,从而可以全面评估转译系统的性能。与现有方法相比,CRUST-Bench更关注整个代码仓库的转译,从而可以更好地衡量系统在处理复杂依赖关系方面的能力。
关键设计:CRUST-Bench的数据集选择了100个具有代表性的C代码仓库,涵盖了不同的应用领域和代码风格。手动编写的Rust接口遵循Rust的最佳实践,确保转译后的代码符合语言习惯和内存安全。测试用例的设计旨在全面覆盖C代码的功能,确保转译后的代码的功能正确性。论文还提供了评估指标,用于衡量转译系统的安全性、正确性和代码风格。
🖼️ 关键图片
📊 实验亮点
论文评估了最先进的LLM在CRUST-Bench上的性能,结果表明,即使是OpenAI o1模型在单次尝试设置中也只能解决15%的任务。这表明C到安全Rust的自动转译仍然是一个具有挑战性的问题,需要进一步的研究和开发。实验结果还揭示了LLM在转译过程中常见的错误类型,为改进转译系统提供了有价值的 insights。
🎯 应用场景
CRUST-Bench可用于评估和改进C到Rust的自动转译系统,加速遗留C代码库向更安全、更现代的Rust语言的迁移。这有助于提高软件系统的安全性、可靠性和可维护性,并促进Rust生态系统的发展。该基准测试还可以用于指导编译器和静态分析工具的开发,以更好地支持C到Rust的转译。
📄 摘要(原文)
C-to-Rust transpilation is essential for modernizing legacy C code while enhancing safety and interoperability with modern Rust ecosystems. However, no dataset currently exists for evaluating whether a system can transpile C into safe Rust that passes a set of test cases. We introduce CRUST-Bench, a dataset of 100 C repositories, each paired with manually-written interfaces in safe Rust as well as test cases that can be used to validate correctness of the transpilation. By considering entire repositories rather than isolated functions, CRUST-Bench captures the challenges of translating complex projects with dependencies across multiple files. The provided Rust interfaces provide explicit specifications that ensure adherence to idiomatic, memory-safe Rust patterns, while the accompanying test cases enforce functional correctness. We evaluate state-of-the-art large language models (LLMs) on this task and find that safe and idiomatic Rust generation is still a challenging problem for various state-of-the-art methods and techniques. We also provide insights into the errors LLMs usually make in transpiling code from C to safe Rust. The best performing model, OpenAI o1, is able to solve only 15 tasks in a single-shot setting. Improvements on CRUST-Bench would lead to improved transpilation systems that can reason about complex scenarios and help in migrating legacy codebases from C into languages like Rust that ensure memory safety. You can find the dataset and code at https://github.com/anirudhkhatry/CRUST-bench.