分享自:

从C到Rust的翻译:用户研究的经验教训

期刊:Network and Distributed System Security (NDSS) SymposiumDOI:10.14722/ndss.2025.241407

本文是一篇关于将C语言代码翻译为Rust语言的用户研究的学术论文,由Ruishi Li、Bo Wang、Tianyu Li、Prateek Saxena和Ashish Kundu共同撰写,发表于2025年的NDSS(网络与分布式系统安全)研讨会。该研究的主要目的是探讨人类用户如何将现有的C语言代码翻译为Rust语言,并分析其翻译策略、安全性、性能以及功能正确性。

研究背景

C语言程序中的内存安全问题仍然是当前软件漏洞的主要来源之一。尽管通过编译器插入运行时检查可以实现完全的内存安全,但这通常会导致较高的性能开销(≥50%),因此在生产环境中很少部署。部分内存安全防御措施虽然开销较低(<20%),但并不能完全消除内存安全漏洞。Rust作为一种新兴的主流编程语言,提供了低级别的内存控制,同时保证了完全的内存安全。Rust的设计理念与传统的C语言安全方言不同,它放弃了C语言中的许多不安全编程抽象,如未检查的原始指针和不安全的类型转换。

近年来,自动将C代码翻译为Rust的技术开始出现,主要分为两种方法:基于编译器分析的方法和基于大语言模型(LLM)的方法。然而,这两种方法的效果都非常有限,尤其是在处理小型程序时。因此,本文通过用户研究,探讨人类用户如何完成C到Rust的翻译任务,并分析其翻译策略。

研究流程

研究选取了8个真实世界的C语言程序作为基准,要求参与研究的本科生在20天内将这些程序翻译为安全的Rust代码。参与者熟悉C语言和内存安全问题,但对Rust的了解较少。研究共收集了33名参与者的翻译结果,其中31个翻译能够编译并通过测试。

主要结果

  1. 翻译策略:用户提供的Rust翻译通常从C代码的低级抽象中提升语义,重新表达逻辑,而不是过于紧密地模仿原始程序和数据流结构。这种策略帮助用户摆脱了C代码中的低级约束,避免了违反Rust的严格规则。
  2. 零成本抽象:用户翻译的Rust代码中通常包含零成本的静态检查安全抽象,尤其是时间内存安全(temporal memory safety),这在许多先前的防御措施中是主要的运行时开销来源。通过静态检查,Rust程序在性能上与C程序相当,甚至在某些情况下更快。
  3. 功能差异:几乎所有Rust翻译与原始C代码都存在功能差异。这些差异通常通过模糊测试(fuzzing)发现,且不同用户翻译的同一C程序在相同测试中往往失败。这些差异部分是由于C程序中的未定义行为在不同用户翻译中被不同处理,部分则是逻辑错误。

研究结论

研究表明,将C代码翻译为Rust是值得的,因为用户翻译的Rust程序在性能和安全性之间取得了良好的平衡。尽管自动翻译工具目前效果有限,但用户翻译的策略为未来的自动翻译工具提供了有价值的参考。特别是,用户翻译中广泛使用的零成本抽象和消除不安全代码模式的做法,展示了Rust在内存安全方面的潜力。

研究亮点

  1. 重要发现:用户翻译的Rust程序在性能和安全性之间取得了良好的平衡,尤其是在时间内存安全方面,通过静态检查显著降低了运行时开销。
  2. 方法新颖性:这是首次通过用户研究探讨C到Rust翻译的策略,为未来的自动翻译工具提供了新的思路。
  3. 研究对象的特殊性:研究选取了真实世界的C程序作为基准,确保了研究结果的实用性和可推广性。

其他有价值的内容

研究还分析了现有自动翻译工具的局限性,并提出了改进建议。特别是,基于LLM的翻译工具虽然生成的代码更具可读性,但在处理长代码时仍面临挑战。未来的研究可以探索如何更好地分解C程序,以便LLM能够更有效地生成可编译的Rust代码。

总结

本文通过用户研究揭示了人类用户在C到Rust翻译中的策略和挑战,展示了Rust在内存安全方面的潜力。尽管自动翻译工具目前效果有限,但用户翻译的策略为未来的工具开发提供了宝贵的参考。

上述解读依据用户上传的学术文献,如有不准确或可能侵权之处请联系本站站长:admin@fmread.com