Translating C code into safe Rust is an effective way to ensure its memory safety. Compared to rule-based translation which produces Rust code that remains largely unsafe, LLM-based methods can generate more idiomatic and safer Rust code because LLMs have been trained on vast amount of human-written idiomatic code. Although promising, existing LLM-based methods still struggle with project-level C-to-Rust translation. They typically partition a C project into smaller units (\eg{} functions) based on call graphs and translate them bottom-up to resolve program dependencies. However, this bottom-up, unit-by-unit paradigm often fails to translate pointers due to the lack of a global perspective on their usage. To address this problem, we propose a novel C-Rust Pointer Knowledge Graph (KG) that enriches a code-dependency graph with two types of pointer semantics: (i) pointer-usage information which record global behaviors such as points-to flows and map lower-level struct usage to higher-level units; and (ii) Rust-oriented annotations which encode ownership, mutability, nullability, and lifetime. Synthesizing the \kg{} with LLMs, we further propose \ourtool{}, which implements a project-level C-to-Rust translation technique. In \ourtool{}, the \kg{} provides LLMs with comprehensive pointer semantics from a global perspective, thus guiding LLMs towards generating safe and idiomatic Rust code from a given C project. Our experiments show that \ourtool{} reduces unsafe usages in translated Rust by 99.9\% compared to both rule-based translation and traditional LLM-based rewriting, while achieving an average 29.3\% higher functional correctness than those fuzzing-enhanced LLM methods.
- ID статьи: 2510.10956
- Название: Project-Level C-to-Rust Translation via Synergistic Integration of Knowledge Graphs and Large Language Models
- Авторы: Zhiqiang Yuan, Wenjun Mao, Zhuo Chen, Xiyue Shang, Chong Wang, Yiling Lou, Xin Peng
- Классификация: cs.SE (Программная инженерия), cs.AI (Искусственный интеллект)
- Дата публикации: 13 октября 2025 г.
- Ссылка на статью: https://arxiv.org/abs/2510.10956
Трансляция кода на C в безопасный код на Rust является эффективным методом обеспечения безопасности памяти. По сравнению с методами трансляции на основе правил, которые производят большое количество небезопасного кода, методы на основе больших языковых моделей (LLM) способны генерировать более идиоматичный и безопасный код на Rust. Однако существующие методы на основе LLM по-прежнему испытывают трудности при трансляции C в Rust на уровне проекта, особенно при обработке указателей, где отсутствует глобальная перспектива. Для решения этой проблемы в работе предложен новый граф знаний указателей C-Rust (KG), который обогащает граф зависимостей кода двумя типами семантики указателей: (1) информация об использовании указателей, фиксирующая глобальное поведение; (2) аннотации, ориентированные на Rust, кодирующие владение, изменяемость, обнуляемость и время жизни. На основе этого графа знаний предложена техника PTRMAPPER для реализации трансляции C в Rust на уровне проекта. Экспериментальные результаты показывают, что PTRMAPPER снижает использование небезопасного кода на 99,9% по сравнению с методами на основе правил и традиционными методами LLM, а также повышает функциональную корректность в среднем на 29,3%.
Язык C широко используется в операционных системах, встроенных системах и приложениях, критичных по производительности, однако его ручное управление памятью и прямые операции с указателями часто приводят к уязвимостям безопасности, таким как переполнение буфера и утечки памяти. Rust как современная альтернатива обеспечивает безопасность памяти при сохранении производительности C. Таким образом, автоматическая трансляция унаследованного кода на C в Rust становится насущной необходимостью.
- Методы на основе правил: зависят от предопределённых правил, генерируемый код на Rust широко использует блоки unsafe, сырые указатели и внешние вызовы функций, что всё ещё представляет риск безопасности
- Существующие методы на основе LLM: применяют парадигму трансляции "снизу вверх" на уровне отдельных единиц, лишены глобальной перспективы использования указателей, часто допускают конфликты определения-использования при трансляции указателей
C и Rust принципиально различаются в использовании указателей:
- Язык C: указатели высокогибкие, при определении указывается только тип, при использовании возможно свободное чтение, запись и модификация
- Язык Rust: использование указателей строго ограничено, при определении необходимо явно указать владение, изменяемость и время жизни, при использовании необходимо строго соблюдать правила проверки заимствований
- Предложен новый граф знаний указателей C-Rust (KG): способен комплексно моделировать зависимости единиц кода, информацию об использовании указателей и аннотации, ориентированные на Rust, в контексте проекта
- Разработана техника трансляции PTRMAPPER на уровне проекта: использует синергию графа знаний C-Rust и LLM для трансляции проекта на C в безопасный и идиоматичный код на Rust
- Достигнуто значительное повышение производительности: генерируется более идиоматичный, безопасный и корректный код на Rust
- Предоставлена комплексная экспериментальная верификация: абляционные исследования доказывают важность информации об использовании указателей и аннотаций, ориентированных на Rust, для повышения производительности трансляции
Дан проект на C, необходимо автоматически перевести его в функционально эквивалентный, безопасный по памяти и идиоматичный проект на Rust. Входные данные — набор исходных файлов на C, выходные данные — компилируемый и исполняемый проект на Rust.
PTRMAPPER состоит из трёх основных этапов:
Проектирование схемы графа знаний:
- Граф зависимостей кода: описывает отношения зависимостей между единицами кода (функции, структуры, перечисления и т.д.)
- Информация об использовании указателей: фиксирует поведение указателей на уровне проекта, включая:
- Сущности: Param (параметр), Value (возвращаемое значение), Member (член), Pointer (указатель) и т.д.
- Отношения: derivesFrom (отношение производства), mayAlias/noAlias (отношение псевдонимов), pointsTo (отношение указания) и т.д.
- Аннотации, ориентированные на Rust: содержат семантику владения, изменяемости, обнуляемости, времени жизни и т.д.
Процесс построения:
- Извлечение графа зависимостей кода: использует статический анализ для извлечения единиц кода и их отношений зависимостей
- Извлечение информации об использовании указателей: применяет анализ, чувствительный к контексту и полям
- Извлечение аннотаций, ориентированных на Rust: анализирует время жизни указателей на основе предопределённых правил и аннотирует соответствующую семантику
Идентификация и упорядочение единиц трансляции:
- Использует алгоритм Тарьяна для обнаружения сильно связанных компонент (SCC)
- Каждый SCC служит независимой единицей трансляции
- Топологическая сортировка определяет порядок трансляции "снизу вверх"
Извлечение семантики указателей:
Для каждой единицы трансляции извлекает соответствующие знания о семантике указателей из графа знаний в форме троек <сущность1, отношение, сущность2>, предоставляемых LLM.
Инкрементальная трансляция и верификация:
- Интегрирует единицу трансляции, знания о семантике указателей и уже переведённый контекст на Rust в подсказку трансляции
- Каждая переведённая единица немедленно интегрируется в проект на Rust и проходит компиляцию
- При возникновении ошибок активируется механизм исправления ошибок
Использует версию графа знаний указателей на Rust для предоставления LLM контекста семантики на уровне проекта:
- Отношения зависимостей помогают точно идентифицировать единицы кода, связанные с ошибкой
- Аннотации, ориентированные на Rust, предоставляют точное руководство по семантике программы для эффективного исправления
- Моделирование глобальной семантики указателей: впервые интегрирует информацию об использовании указателей на уровне проекта и специфичную для Rust семантику в граф знаний
- Парадигма синергетической трансляции: объединяет глобальную перспективу графа знаний с генеративными возможностями LLM
- Механизм инкрементальной верификации: своевременно обнаруживает и исправляет ошибки, предотвращая их накопление
- Интеллектуальное исправление ошибок: основано на семантической информации графа знаний, а не только на сообщениях об ошибках компилятора
Использует 16 реальных проектов на C из набора данных CROWN с количеством строк кода от 154 до 14 829, включая:
- Небольшие проекты: avl, buffer, genann, quadtree, rgba, urlparser и т.д.
- Крупные проекты: bzip2, heman, lodepng и т.д.
Для оценки функциональной эквивалентности вручную построены модульные тесты, достигающие покрытия строк 81,4%-97,7% и покрытия функций 92,9%-100,0%.
Оценка идиоматичности:
- Lint Alert Count: использует Rust-Clippy для подсчёта предупреждений о неидиоматичном коде
- Unsafe Usage Count: использует Cargo-geiger для подсчёта использований unsafe кода
Оценка корректности:
- Compiled: доля функций, успешно скомпилированных
- Equiv.: доля функций, прошедших модульные тесты
- Сравнение идиоматичности: CROWN (на основе правил), PR2 (переписывание на основе LLM)
- Сравнение корректности: FLOURINE (метод LLM, усиленный нечётким тестированием)
- Абляционные исследования: PTRTRANSPS, PTRTRANSPU, PTRTRANSRA, PTRTRANSEC и другие варианты
- LLM: ChatGPT-4o, temperature=0
- Статический анализ: Clang, Doxygen, фреймворк SVF
- Исправление ошибок: максимум 5 итераций
- Верификация компиляции: cargo check
Значительное повышение идиоматичности:
- По сравнению с CROWN: предупреждения Lint снижены на 94,9% (6 802→349), использование unsafe снижено на 99,9% (141 866→85)
- По сравнению с PR2: предупреждения Lint снижены на 91,8% (4 272→349), использование unsafe снижено на 99,9% (134 185→85)
Значительное улучшение корректности:
- По сравнению с FLOURINE: успешность компиляции повышена на 28,4% (98,3% против 69,9%), функциональная эквивалентность повышена на 29,3% (81,6% против 52,3%)
- Небольшие проекты (avl, rgba, ht, bst) достигают 100% функциональной эквивалентности
Абляционные исследования подтверждают важность каждого компонента:
- Без семантики указателей (PTRTRANSPS): коэффициент эквивалентности снижается с 81,6% до 59,5%, снижение на 22,1%
- Только информация об использовании указателей (PTRTRANSRA): производительность ниже, чем у полной версии
- Только аннотации Rust (PTRTRANSPU): аналогичное снижение производительности
- Без исправления ошибок (PTRTRANSEC): коэффициент эквивалентности снижается с 81,6% до 50,8%, снижение на 30,8%
PTRMAPPER демонстрирует стабильную производительность при различной сложности:
- Количество строк кода: производительность стабильна с увеличением сложности, FLOURINE резко падает
- Отношения зависимостей: при количестве зависимостей [16,44) коэффициент эквивалентности 57,1%, FLOURINE — 0%
- Количество указателей: при количестве указателей [20,50) коэффициент эквивалентности 50,0%, FLOURINE — 0%
На примере проекта Quadtree демонстрируется, как PTRMAPPER решает сложные конфликты заимствований:
- Идентифицирует, что параметр
tree должен быть неизменяемым заимствованием &Quadtree - Разделяет
root на изменяемое заимствование &mut QuadtreeNode - Извлекает
key_free как независимый параметр для избежания конфликтов заимствований - Корректно обрабатывает семантику владения
- Методы на основе правил: Corrode, C2RUST и т.д., производят большое количество unsafe кода
- Методы на основе LLM: SPECTRA, FLOURINE и т.д., лишены глобальной перспективы
- Методы трансляции отдельных единиц: SYZYGY и т.д., имеют проблему потери семантики указателей
- Впервые систематически моделирует семантику указателей на уровне проекта
- Комбинированный метод статического анализа и генерации LLM
- Значительное повышение безопасности и корректности
- Граф знаний указателей C-Rust эффективно решает проблему потери семантики указателей при трансляции на уровне проекта
- Синергетическая интеграция статического анализа и LLM значительно повышает качество трансляции
- Механизмы инкрементальной верификации и интеллектуального исправления ошибок обеспечивают надёжность трансляции
- Затраты на построение: построение графа знаний требует дополнительного времени статического анализа
- Зависимость от правил: извлечение аннотаций Rust зависит от предопределённых правил, возможна неполнота покрытия
- Масштабируемость проекта: масштабируемость для сверхбольших проектов требует дальнейшей верификации
- Ручное вмешательство: в сложных случаях может потребоваться небольшое ручное вмешательство
- Оптимизация эффективности построения графа знаний
- Расширение на другие пары языков программирования
- Интеграция дополнительных методов программного анализа
- Повышение степени автоматизации
- Высокая инновационность: впервые объединяет граф знаний и LLM для трансляции кода, решая фундаментальные проблемы существующих методов
- Систематичность метода: от анализа проблемы до разработки решения всё полно, техническая стратегия ясна
- Полнота экспериментов: 16 реальных проектов, множество методов сравнения, детальные абляционные исследования
- Значительные результаты: достигнуто значительное улучшение по трём измерениям: безопасность, идиоматичность, корректность
- Высокая практическая ценность: решает реальные инженерные проблемы, имеет сильные перспективы применения
- Проблемы масштабируемости: вычислительная сложность статического анализа может ограничить применение на сверхбольших проектах
- Полнота правил: правила извлечения аннотаций Rust могут не охватывать все граничные случаи
- Ограничения оценки: верификация проводилась в основном на проектах среднего размера, производительность на крупных проектах требует дальнейшей верификации
- Зависимость от качества: эффективность метода в значительной степени зависит от точности статического анализа
- Академический вклад: предоставляет новую исследовательскую парадигму для области трансляции кода, объединяя программный анализ и генеративный ИИ
- Инженерная ценность: предоставляет практический инструмент для миграции C в Rust, способствуя повышению безопасности программного обеспечения
- Технологическое вдохновение: идея управления LLM графом знаний может быть обобщена на другие задачи генерации кода
- Миграция унаследованных систем: подходит для проектов, требующих миграции библиотек кода на C в Rust
- Приложения, критичные по безопасности: для разработки систем с высокими требованиями к безопасности памяти
- Инструменты автоматизации: может быть интегрирован в IDE или конвейеры CI/CD
- Образование и обучение: помогает разработчикам изучить концепции безопасности памяти в Rust
Статья цитирует 76 связанных работ, охватывающих важные исследования в области трансляции кода, программного анализа, больших языковых моделей и других областей, обеспечивая прочную теоретическую основу для исследования.
Общая оценка: Это высококачественная научная работа в области программной инженерии, которая инновационно объединяет граф знаний и большие языковые модели для решения ключевых проблем трансляции C в Rust. Метод разработан разумно, экспериментальная верификация полна, результаты убедительны. Несмотря на некоторые ограничения, работа открывает новое направление исследований в области трансляции кода и имеет важное академическое значение и практическое применение.