EVOC2RUST: Фреймворк для перевода проектов с C на Rust с использованием скелетного подхода
EVOC2RUST: A Skeleton-guided Framework for Project-Level C-to-Rust Translation
August 6, 2025
Авторы: Chaofan Wang, Tingrui Yu, Jie Wang, Dong Chen, Wenrui Zhang, Yuling Shi, Xiaodong Gu, Beijun Shen
cs.AI
Аннотация
Гарантии безопасности на этапе компиляции в Rust делают его идеальным выбором для критически важных систем, что создает спрос на перевод устаревших кодовых баз с C на Rust. Хотя для этой задачи появились различные подходы, они сталкиваются с неизбежными компромиссами: решения на основе правил испытывают трудности с обеспечением безопасности и идиоматичности кода, а решения на основе LLM (языковых моделей) часто не могут генерировать семантически эквивалентный код на Rust из-за сильной зависимости модулей во всей кодовой базе. Недавние исследования показали, что оба подхода ограничены небольшими программами. В данной статье мы предлагаем EvoC2Rust — автоматизированную платформу для преобразования целых проектов на C в эквивалентные проекты на Rust. EvoC2Rust использует стратегию перевода с использованием скелета для перевода на уровне проекта. Процесс состоит из трех эволюционных этапов: 1) сначала проект на C разбивается на функциональные модули, применяется LLM с улучшенным сопоставлением признаков для преобразования определений и макросов, а также генерируются проверенные на типы заглушки функций, которые формируют компилируемый скелет на Rust; 2) затем функции переводятся постепенно, заменяя соответствующие заглушки; 3) наконец, ошибки компиляции устраняются путем интеграции LLM и статического анализа. Благодаря эволюционному усилению, EvoC2Rust сочетает преимущества как решений на основе правил, так и на основе LLM. Наша оценка на открытых тестовых наборах и шести промышленных проектах демонстрирует превосходную производительность EvoC2Rust в переводе проектов с C на Rust. В среднем, он достигает улучшений на 17,24% и 14,32% в точности синтаксиса и семантики по сравнению с подходами на основе LLM, а также на 96,79% более высокий уровень безопасности кода по сравнению с инструментами на основе правил. На уровне модулей EvoC2Rust достигает 92,25% успешной компиляции и 89,53% прохождения тестов на промышленных проектах, даже для сложных кодовых баз и длинных функций.
English
Rust's compile-time safety guarantees make it ideal for safety-critical
systems, creating demand for translating legacy C codebases to Rust. While
various approaches have emerged for this task, they face inherent trade-offs:
rule-based solutions face challenges in meeting code safety and idiomaticity
requirements, while LLM-based solutions often fail to generate semantically
equivalent Rust code, due to the heavy dependencies of modules across the
entire codebase. Recent studies have revealed that both solutions are limited
to small-scale programs. In this paper, we propose EvoC2Rust, an automated
framework for converting entire C projects to equivalent Rust ones. EvoC2Rust
employs a skeleton-guided translation strategy for project-level translation.
The pipeline consists of three evolutionary stages: 1) it first decomposes the
C project into functional modules, employs a feature-mapping-enhanced LLM to
transform definitions and macros and generates type-checked function stubs,
which form a compilable Rust skeleton; 2) it then incrementally translates the
function, replacing the corresponding stub placeholder; 3) finally, it repairs
compilation errors by integrating LLM and static analysis. Through evolutionary
augmentation, EvoC2Rust combines the advantages of both rule-based and
LLM-based solutions. Our evaluation on open-source benchmarks and six
industrial projects demonstrates EvoC2Rust's superior performance in
project-level C-to-Rust translation. On average, it achieves 17.24% and 14.32%
improvements in syntax and semantic accuracy over the LLM-based approaches,
along with a 96.79% higher code safety rate than the rule-based tools. At the
module level, EvoC2Rust reaches 92.25% compilation and 89.53% test pass rates
on industrial projects, even for complex codebases and long functions.