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(人工知能)
- 発表日: 2025年10月13日
- 論文リンク: https://arxiv.org/abs/2510.10956
CコードをセキュアなRustコードに翻訳することは、メモリ安全性を確保する効果的な方法である。大量の安全でないコードを生成するルールベースの翻訳方法と比較して、大規模言語モデル(LLM)ベースの方法は、より慣用的で安全なRustコードを生成することができる。しかし、既存のLLM方法は、特にポインタ処理時にグローバルな視点が欠けているため、プロジェクトレベルのC-Rust翻訳において依然として困難を抱えている。この問題を解決するため、本論文は新規なC-Rustポインタ知識グラフ(KG)を提案する。このグラフは、コード依存グラフを2種類のポインタセマンティクスで充実させている:(1)グローバルな動作を記録するポインタ使用情報、(2)所有権、可変性、ヌル可能性、およびライフタイムをエンコードするRust指向注釈。この知識グラフに基づき、プロジェクトレベルのC-Rust翻訳を実現するPTRMAPPER技術を提案した。実験により、PTRMAPPERはルールベースおよび従来のLLM方法と比較して、安全でないコードの使用を99.9%削減し、機能正確性を平均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は3つの主要なステージで構成される:
知識グラフスキーマ設計:
- コード依存グラフ:コード単位(関数、構造体、列挙型など)間の依存関係を記述する
- ポインタ使用情報:プロジェクトレベルのポインタ動作を捕捉し、以下を含む:
- エンティティ:Param(パラメータ)、Value(戻り値)、Member(メンバ)、Pointer(ポインタ)など
- 関係:derivesFrom(派生関係)、mayAlias/noAlias(エイリアス関係)、pointsTo(指向関係)など
- Rust指向注釈:所有権、可変性、ヌル可能性、ライフタイムなどのセマンティクスを含む
構築プロセス:
- コード依存グラフ抽出:静的分析を使用してコード単位とその依存関係を抽出する
- ポインタ使用情報抽出:コンテキスト敏感、フィールド敏感な分析戦略を採用する
- Rust指向注釈抽出:事前定義されたルールに基づいてポインタライフタイムを分析し、対応するセマンティクスに注釈を付ける
翻訳単位の識別と順序付け:
- Tarjanアルゴリズムを使用して強連結成分(SCC)を検出する
- 各SCCを独立した翻訳単位として扱う
- トポロジカルソートでボトムアップの翻訳順序を決定する
ポインタセマンティクス抽出:
各翻訳単位に対して、KGから対応するポインタセマンティクス知識を抽出し、<エンティティ1、関係、エンティティ2>三つ組の形式でLLMに提供する。
段階的翻訳と検証:
- 翻訳単位、ポインタセマンティクス知識、および既翻訳Rustコンテキストを翻訳プロンプトに統合する
- 各翻訳単位生成後、直ちにRustプロジェクトに統合してコンパイル検証する
- エラーが発生した場合、エラー修正メカニズムをトリガーする
Rustバージョンのポインタ知識グラフを利用してLLMにプロジェクトレベルのセマンティクコンテキストを提供する:
- 依存関係はエラー関連のコード単位を正確に識別するのに役立つ
- Rust指向注釈は効果的な修正を導くための正確なプログラムセマンティクスガイダンスを提供する
- グローバルポインタセマンティクスモデリング:プロジェクトレベルのポインタ使用情報とRust固有のセマンティクスを知識グラフに統合した初めての試み
- 協調翻訳パラダイム:知識グラフのグローバル視点とLLMの生成能力を結合する
- 段階的検証メカニズム:エラーを時間内に発見・修正し、エラーの累積を防止する
- インテリジェントエラー修正:コンパイラエラー情報のみに依存するのではなく、KGのセマンティクス情報に基づく
CROWN データセットから16個の実際のCプロジェクトを使用。コード行数は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% vs 69.9%)、機能等価率が29.3%向上(81.6% vs 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個の実際のプロジェクト、複数の比較方法、詳細な消融実験
- 効果が顕著:セキュリティ、慣用性、正確性の3つの次元で顕著な向上を達成
- 実用価値が高い:実際のエンジニアリング問題を解決し、強い応用前景を持つ
- スケーラビリティの問題:静的分析の計算複雑度は超大規模プロジェクトでの応用を制限する可能性がある
- ルール完全性:Rust注釈抽出ルールはすべてのエッジケースをカバーできない可能性がある
- 評価の限界:主に中小規模プロジェクトで検証されており、大規模プロジェクトのパフォーマンスはさらなる検証が必要
- 依存品質:方法の効果は静的分析の正確性に大きく依存する
- 学術的貢献:コード翻訳分野に新しい研究パラダイムを提供し、プログラム分析と生成型AIを結合した
- エンジニアリング価値:C-Rust移行に実用的なツールを提供し、ソフトウェアセキュリティ向上に貢献
- 技術的示唆:知識グラフがLLMを誘導する考え方は他のコード生成タスクに推広可能
- レガシーシステム移行:Cコードベースをrustに移行する必要があるプロジェクトに適している
- セキュリティクリティカルアプリケーション:メモリセーフティ要件が高いシステム開発
- 自動化ツール:IDE またはCI/CDパイプラインに統合可能
- 教育訓練:開発者がRustのメモリセーフティ概念を学ぶのに役立つ
論文は76篇の関連文献を引用しており、コード翻訳、プログラム分析、大規模言語モデルなど複数の分野の重要な研究をカバーしており、研究に堅実な理論的基礎を提供している。
総合評価:これは高品質なソフトウェアエンジニアリング研究論文であり、知識グラフと大規模言語モデルを革新的に結合してC-Rust翻訳の主要な問題を解決している。方法設計が合理的で、実験検証が充分であり、結果は説得力がある。いくつかの限界は存在するが、コード翻訳分野に新しい研究方向を切り開いており、重要な学術的価値と実用的意義を持つ。