SpeC2Rust translates C projects into safe Rust with fewer errors
SpeC2Rust: Specification-Driven Repository-Level C-to-Rust Translation
Software Engineering
Summary
Many important software projects are written in C, but C's weak safety features cause bugs and security problems. The authors created SpeC2Rust, a method that breaks a large C project into parts, writes detailed specifications, and uses these to guide translation into Rust without unsafe code. Their system also fixes errors efficiently using targeted feedback. Tests show that Rust code produced by SpeC2Rust compiles and passes original tests while avoiding unsafe operations.
What this means in practice
- •For systems software developers: Convert legacy C system software safely into Rust, preserving project structure and passing existing tests without unsafe code.
- •For software maintenance teams: Use automated translation to reduce risks from unsafe pointers and improve code safety across large C codebases.
Authors
Junjie Yao, Xiongzheng Guan, Jia Feng, Yujia Chen, Hongliang Tian, Cuiyun Gao
Abstract
Legacy C codebases remain central to system software and performance-critical infrastructure, but their weak memory safety imposes security and maintenance risks. Recent C-to-Rust translation systems, including LLM-based translators, make automated migration increasingly feasible, yet they still struggle to recover repository-level intent, avoid raw pointers and unsafe constructs, maintain cross-file interfaces, and repair compilation and validation failures efficiently. We propose SpeC2Rust, a specification-driven pipeline for repository-level C-to-Rust translation. It has three stages: (1) Project-Intent Structuring, which decomposes a C repository into semantically coherent modules and generates persistent repository- and module-level specifications; (2) Spec-Guided Generation, which translates each Rust module against these specifications with a live symbol registry to preserve cross-file consistency; and (3) Layered-Feedback Repair, which batches repairs and injects only failure-relevant diagnostics, specification context, and source evidence for efficient compilation and test-driven correction. We evaluate SpeC2Rust on eight repository-level C projects. It generates Rust projects that compile and pass the original end-to-end tests, with no raw-pointer declarations, raw-pointer dereferences, or unsafe lines. On projects shared with an LLM-based baseline, SpeC2Rust reduces cost by 66.1% and input-token usage by 84.7%.