2025-11-14T08:10:11.695880

Project-Level C-to-Rust Translation via Synergistic Integration of Knowledge Graphs and Large Language Models

Yuan, Mao, Chen et al.
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.
academic

Трансляция C в Rust на уровне проекта посредством синергетической интеграции графов знаний и больших языковых моделей

Основная информация

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

Предпосылки и мотивация исследования

1. Определение проблемы

Язык C широко используется в операционных системах, встроенных системах и приложениях, критичных по производительности, однако его ручное управление памятью и прямые операции с указателями часто приводят к уязвимостям безопасности, таким как переполнение буфера и утечки памяти. Rust как современная альтернатива обеспечивает безопасность памяти при сохранении производительности C. Таким образом, автоматическая трансляция унаследованного кода на C в Rust становится насущной необходимостью.

2. Ограничения существующих методов

  • Методы на основе правил: зависят от предопределённых правил, генерируемый код на Rust широко использует блоки unsafe, сырые указатели и внешние вызовы функций, что всё ещё представляет риск безопасности
  • Существующие методы на основе LLM: применяют парадигму трансляции "снизу вверх" на уровне отдельных единиц, лишены глобальной перспективы использования указателей, часто допускают конфликты определения-использования при трансляции указателей

3. Основные вызовы

C и Rust принципиально различаются в использовании указателей:

  • Язык C: указатели высокогибкие, при определении указывается только тип, при использовании возможно свободное чтение, запись и модификация
  • Язык Rust: использование указателей строго ограничено, при определении необходимо явно указать владение, изменяемость и время жизни, при использовании необходимо строго соблюдать правила проверки заимствований

Основные вклады

  1. Предложен новый граф знаний указателей C-Rust (KG): способен комплексно моделировать зависимости единиц кода, информацию об использовании указателей и аннотации, ориентированные на Rust, в контексте проекта
  2. Разработана техника трансляции PTRMAPPER на уровне проекта: использует синергию графа знаний C-Rust и LLM для трансляции проекта на C в безопасный и идиоматичный код на Rust
  3. Достигнуто значительное повышение производительности: генерируется более идиоматичный, безопасный и корректный код на Rust
  4. Предоставлена комплексная экспериментальная верификация: абляционные исследования доказывают важность информации об использовании указателей и аннотаций, ориентированных на Rust, для повышения производительности трансляции

Детальное описание метода

Определение задачи

Дан проект на C, необходимо автоматически перевести его в функционально эквивалентный, безопасный по памяти и идиоматичный проект на Rust. Входные данные — набор исходных файлов на C, выходные данные — компилируемый и исполняемый проект на Rust.

Архитектура модели

PTRMAPPER состоит из трёх основных этапов:

1. Построение графа знаний указателей C-Rust

Проектирование схемы графа знаний:

  • Граф зависимостей кода: описывает отношения зависимостей между единицами кода (функции, структуры, перечисления и т.д.)
  • Информация об использовании указателей: фиксирует поведение указателей на уровне проекта, включая:
    • Сущности: Param (параметр), Value (возвращаемое значение), Member (член), Pointer (указатель) и т.д.
    • Отношения: derivesFrom (отношение производства), mayAlias/noAlias (отношение псевдонимов), pointsTo (отношение указания) и т.д.
  • Аннотации, ориентированные на Rust: содержат семантику владения, изменяемости, обнуляемости, времени жизни и т.д.

Процесс построения:

  1. Извлечение графа зависимостей кода: использует статический анализ для извлечения единиц кода и их отношений зависимостей
  2. Извлечение информации об использовании указателей: применяет анализ, чувствительный к контексту и полям
  3. Извлечение аннотаций, ориентированных на Rust: анализирует время жизни указателей на основе предопределённых правил и аннотирует соответствующую семантику

2. Трансляция кода, управляемая графом знаний

Идентификация и упорядочение единиц трансляции:

  • Использует алгоритм Тарьяна для обнаружения сильно связанных компонент (SCC)
  • Каждый SCC служит независимой единицей трансляции
  • Топологическая сортировка определяет порядок трансляции "снизу вверх"

Извлечение семантики указателей: Для каждой единицы трансляции извлекает соответствующие знания о семантике указателей из графа знаний в форме троек <сущность1, отношение, сущность2>, предоставляемых LLM.

Инкрементальная трансляция и верификация:

  • Интегрирует единицу трансляции, знания о семантике указателей и уже переведённый контекст на Rust в подсказку трансляции
  • Каждая переведённая единица немедленно интегрируется в проект на Rust и проходит компиляцию
  • При возникновении ошибок активируется механизм исправления ошибок

3. Исправление ошибок, управляемое графом знаний

Использует версию графа знаний указателей на Rust для предоставления LLM контекста семантики на уровне проекта:

  • Отношения зависимостей помогают точно идентифицировать единицы кода, связанные с ошибкой
  • Аннотации, ориентированные на Rust, предоставляют точное руководство по семантике программы для эффективного исправления

Технические инновации

  1. Моделирование глобальной семантики указателей: впервые интегрирует информацию об использовании указателей на уровне проекта и специфичную для Rust семантику в граф знаний
  2. Парадигма синергетической трансляции: объединяет глобальную перспективу графа знаний с генеративными возможностями LLM
  3. Механизм инкрементальной верификации: своевременно обнаруживает и исправляет ошибки, предотвращая их накопление
  4. Интеллектуальное исправление ошибок: основано на семантической информации графа знаний, а не только на сообщениях об ошибках компилятора

Экспериментальная установка

Набор данных

Использует 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 решает сложные конфликты заимствований:

  1. Идентифицирует, что параметр tree должен быть неизменяемым заимствованием &Quadtree
  2. Разделяет root на изменяемое заимствование &mut QuadtreeNode
  3. Извлекает key_free как независимый параметр для избежания конфликтов заимствований
  4. Корректно обрабатывает семантику владения

Связанные работы

Исследования трансляции C в Rust

  1. Методы на основе правил: Corrode, C2RUST и т.д., производят большое количество unsafe кода
  2. Методы на основе LLM: SPECTRA, FLOURINE и т.д., лишены глобальной перспективы
  3. Методы трансляции отдельных единиц: SYZYGY и т.д., имеют проблему потери семантики указателей

Преимущества данной работы

  • Впервые систематически моделирует семантику указателей на уровне проекта
  • Комбинированный метод статического анализа и генерации LLM
  • Значительное повышение безопасности и корректности

Заключение и обсуждение

Основные выводы

  1. Граф знаний указателей C-Rust эффективно решает проблему потери семантики указателей при трансляции на уровне проекта
  2. Синергетическая интеграция статического анализа и LLM значительно повышает качество трансляции
  3. Механизмы инкрементальной верификации и интеллектуального исправления ошибок обеспечивают надёжность трансляции

Ограничения

  1. Затраты на построение: построение графа знаний требует дополнительного времени статического анализа
  2. Зависимость от правил: извлечение аннотаций Rust зависит от предопределённых правил, возможна неполнота покрытия
  3. Масштабируемость проекта: масштабируемость для сверхбольших проектов требует дальнейшей верификации
  4. Ручное вмешательство: в сложных случаях может потребоваться небольшое ручное вмешательство

Направления будущих исследований

  1. Оптимизация эффективности построения графа знаний
  2. Расширение на другие пары языков программирования
  3. Интеграция дополнительных методов программного анализа
  4. Повышение степени автоматизации

Глубокая оценка

Преимущества

  1. Высокая инновационность: впервые объединяет граф знаний и LLM для трансляции кода, решая фундаментальные проблемы существующих методов
  2. Систематичность метода: от анализа проблемы до разработки решения всё полно, техническая стратегия ясна
  3. Полнота экспериментов: 16 реальных проектов, множество методов сравнения, детальные абляционные исследования
  4. Значительные результаты: достигнуто значительное улучшение по трём измерениям: безопасность, идиоматичность, корректность
  5. Высокая практическая ценность: решает реальные инженерные проблемы, имеет сильные перспективы применения

Недостатки

  1. Проблемы масштабируемости: вычислительная сложность статического анализа может ограничить применение на сверхбольших проектах
  2. Полнота правил: правила извлечения аннотаций Rust могут не охватывать все граничные случаи
  3. Ограничения оценки: верификация проводилась в основном на проектах среднего размера, производительность на крупных проектах требует дальнейшей верификации
  4. Зависимость от качества: эффективность метода в значительной степени зависит от точности статического анализа

Влияние

  1. Академический вклад: предоставляет новую исследовательскую парадигму для области трансляции кода, объединяя программный анализ и генеративный ИИ
  2. Инженерная ценность: предоставляет практический инструмент для миграции C в Rust, способствуя повышению безопасности программного обеспечения
  3. Технологическое вдохновение: идея управления LLM графом знаний может быть обобщена на другие задачи генерации кода

Применимые сценарии

  1. Миграция унаследованных систем: подходит для проектов, требующих миграции библиотек кода на C в Rust
  2. Приложения, критичные по безопасности: для разработки систем с высокими требованиями к безопасности памяти
  3. Инструменты автоматизации: может быть интегрирован в IDE или конвейеры CI/CD
  4. Образование и обучение: помогает разработчикам изучить концепции безопасности памяти в Rust

Библиография

Статья цитирует 76 связанных работ, охватывающих важные исследования в области трансляции кода, программного анализа, больших языковых моделей и других областей, обеспечивая прочную теоретическую основу для исследования.


Общая оценка: Это высококачественная научная работа в области программной инженерии, которая инновационно объединяет граф знаний и большие языковые модели для решения ключевых проблем трансляции C в Rust. Метод разработан разумно, экспериментальная верификация полна, результаты убедительны. Несмотря на некоторые ограничения, работа открывает новое направление исследований в области трансляции кода и имеет важное академическое значение и практическое применение.