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

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%.