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

Projektebene C-zu-Rust-Übersetzung durch synergistische Integration von Wissensgraphen und großen Sprachmodellen

Grundlegende Informationen

  • Papier-ID: 2510.10956
  • Titel: Project-Level C-to-Rust Translation via Synergistic Integration of Knowledge Graphs and Large Language Models
  • Autoren: Zhiqiang Yuan, Wenjun Mao, Zhuo Chen, Xiyue Shang, Chong Wang, Yiling Lou, Xin Peng
  • Klassifizierung: cs.SE (Softwaretechnik), cs.AI (Künstliche Intelligenz)
  • Veröffentlichungsdatum: 13. Oktober 2025
  • Papierlink: https://arxiv.org/abs/2510.10956

Zusammenfassung

Die Übersetzung von C-Code in sicheren Rust-Code ist eine wirksame Methode zur Gewährleistung der Speichersicherheit. Im Vergleich zu regelgestützten Übersetzungsmethoden, die große Mengen unsicheren Codes erzeugen, können auf großen Sprachmodellen (LLM) basierende Methoden idiomatischeren und sichereren Rust-Code generieren. Allerdings haben bestehende LLM-Methoden immer noch Schwierigkeiten bei der Übersetzung von C zu Rust auf Projektebene, insbesondere beim Umgang mit Zeigern mangelt es an einer globalen Perspektive. Um dieses Problem zu lösen, wird ein neuartiger C-Rust-Zeiger-Wissensgraph (KG) vorgeschlagen, der den Code-Abhängigkeitsgraph durch zwei Zeiger-Semantiken bereichert: (1) Zeiger-Nutzungsinformationen, die globales Verhalten aufzeichnen; (2) Rust-orientierte Annotationen, die Eigentümerschaft, Veränderlichkeit, Nullbarkeit und Lebensdauer kodieren. Basierend auf diesem Wissensgraph wird die PTRMAPPER-Technik präsentiert, die die Übersetzung von C zu Rust auf Projektebene ermöglicht. Experimente zeigen, dass PTRMAPPER die Verwendung unsicheren Codes um 99,9% im Vergleich zu regelgestützten und traditionellen LLM-Methoden reduziert und die funktionale Korrektheit durchschnittlich um 29,3% verbessert.

Forschungshintergrund und Motivation

1. Problemdefinition

Die Programmiersprache C wird häufig in Betriebssystemen, eingebetteten Systemen und leistungskritischen Anwendungen eingesetzt, aber ihre manuelle Speicherverwaltung und direkten Zeigeroperationen führen häufig zu Sicherheitslücken wie Pufferüberläufen und Speicherlecks. Rust stellt als moderner Ersatz eine Alternative dar, die die Leistung von C beibehält und gleichzeitig Speichersicherheit gewährleistet. Daher ist die automatische Übersetzung von Legacy-C-Code zu Rust ein dringendes Erfordernis.

2. Einschränkungen bestehender Methoden

  • Regelgestützte Methoden: Basieren auf vordefinierten Regeln und erzeugen Rust-Code, der umfangreich unsichere Blöcke, Rohzeiger und externe Funktionsaufrufe verwendet, wodurch Sicherheitsrisiken bestehen bleiben
  • Bestehende LLM-Methoden: Verwenden ein Bottom-up-Paradigma der Einzelübersetzung und mangelt es an einer globalen Zeiger-Nutzungsperspektive, was häufig zu Definitions-Verwendungs-Konflikten bei der Zeigerübersetzung führt

3. Kernherausforderungen

C und Rust unterscheiden sich grundlegend in der Zeigerverwendung:

  • C-Sprache: Zeiger sind hochflexibel; bei der Definition wird nur der Typ angegeben, bei der Verwendung können sie frei gelesen, geschrieben und modifiziert werden
  • Rust-Sprache: Die Zeigerverwendung ist streng eingeschränkt; bei der Definition müssen Eigentümerschaft, Veränderlichkeit und Lebensdauer explizit angegeben werden, bei der Verwendung müssen die Regeln des Borrow-Checkers streng befolgt werden

Kernbeiträge

  1. Vorschlag eines neuartigen C-Rust-Zeiger-Wissensgraphen (KG): Kann Code-Einheits-Abhängigkeiten, Zeiger-Nutzungsinformationen und Rust-orientierte Annotationen aus dem Projektkontext umfassend modellieren
  2. Entwurf der PTRMAPPER-Übersetzungstechnik auf Projektebene: Nutzt den C-Rust-Zeiger-KG in Zusammenarbeit mit LLM, um C-Projekte in sicheren und idiomatischen Rust-Code zu übersetzen
  3. Realisierung erheblicher Leistungsverbesserungen: Generiert idiomatischeren, sichereren und korrekteren Rust-Code
  4. Bereitstellung umfassender experimenteller Validierung: Ablationsexperimente beweisen die Wichtigkeit von Zeiger-Nutzungsinformationen und Rust-orientierten Annotationen zur Verbesserung der Übersetzungsleistung

Methodische Details

Aufgabendefinition

Gegeben ein C-Projekt wird dieses automatisch in ein funktional äquivalentes, speichersicheres und idiomatisches Rust-Projekt übersetzt. Die Eingabe ist eine Menge von C-Quellcodedateien, die Ausgabe ist ein kompilierbares und ausführbares Rust-Projekt.

Modellarchitektur

PTRMAPPER umfasst drei Hauptphasen:

1. Konstruktion des C-Rust-Zeiger-Wissensgraphen

Wissensgraph-Schemadesign:

  • Code-Abhängigkeitsgraph: Beschreibt Abhängigkeitsbeziehungen zwischen Code-Einheiten (Funktionen, Strukturen, Enumerationen usw.)
  • Zeiger-Nutzungsinformationen: Erfasst Zeiger-Verhalten auf Projektebene, einschließlich:
    • Entitäten: Param (Parameter), Value (Rückgabewert), Member (Mitglied), Pointer (Zeiger) usw.
    • Beziehungen: derivesFrom (Ableitungsbeziehung), mayAlias/noAlias (Aliasbeziehung), pointsTo (Zeigt-auf-Beziehung) usw.
  • Rust-orientierte Annotationen: Enthalten Semantiken wie Eigentümerschaft, Veränderlichkeit, Nullbarkeit und Lebensdauer

Konstruktionsprozess:

  1. Code-Abhängigkeitsgraph-Extraktion: Verwendet statische Analyse zur Extraktion von Code-Einheiten und deren Abhängigkeitsbeziehungen
  2. Zeiger-Nutzungsinformations-Extraktion: Verwendet kontextsensitive und feldensensitive Analysestrategie
  3. Rust-orientierte Annotations-Extraktion: Analysiert Zeiger-Lebensdauer basierend auf vordefinierten Regeln und kommentiert entsprechende Semantiken

2. KG-gesteuerte Code-Übersetzung

Identifizierung und Sortierung von Übersetzungseinheiten:

  • Verwendet Tarjan-Algorithmus zur Erkennung stark zusammenhängender Komponenten (SCC)
  • Behandelt jede SCC als unabhängige Übersetzungseinheit
  • Topologische Sortierung bestimmt die Bottom-up-Übersetzungsreihenfolge

Zeiger-Semantik-Extraktion: Extrahiert für jede Übersetzungseinheit entsprechende Zeiger-Semantik-Kenntnisse aus dem KG in Form von Tripeln <Entität1, Beziehung, Entität2> und stellt diese dem LLM zur Verfügung.

Inkrementelle Übersetzung und Validierung:

  • Integriert Übersetzungseinheit, Zeiger-Semantik-Kenntnisse und bereits übersetzten Rust-Kontext in den Übersetzungs-Prompt
  • Jede Übersetzungseinheit wird nach der Generierung sofort in das Rust-Projekt integriert und kompiliert validiert
  • Bei Fehlern wird ein Fehlerkorrekturmechanismus ausgelöst

3. KG-gesteuerte Fehlerkorrektur

Nutzt die Rust-Version des Zeiger-KG, um dem LLM Semantik-Kontext auf Projektebene bereitzustellen:

  • Abhängigkeitsbeziehungen helfen, fehlerbezogene Code-Einheiten präzise zu identifizieren
  • Rust-orientierte Annotationen bieten präzise Programm-Semantik-Anleitung zur effektiven Fehlerbehebung

Technische Innovationen

  1. Globale Zeiger-Semantik-Modellierung: Erste Integration von Zeiger-Nutzungsinformationen auf Projektebene und Rust-spezifischen Semantiken in einen Wissensgraph
  2. Kooperatives Übersetzungsparadigma: Kombiniert die globale Perspektive des Wissensgraphen mit der Generierungsfähigkeit von LLM
  3. Inkrementeller Validierungsmechanismus: Erkennt und korrigiert Fehler zeitnah, um Fehlerakkumulation zu verhindern
  4. Intelligente Fehlerkorrektur: Basiert auf KG-Semantik-Informationen statt nur auf Compiler-Fehlermeldungen

Experimentelle Einrichtung

Datensatz

Verwendet 16 echte C-Projekte aus dem CROWN-Datensatz mit Codezeilen von 154 bis 14.829, einschließlich:

  • Kleine Projekte: avl, buffer, genann, quadtree, rgba, urlparser usw.
  • Große Projekte: bzip2, heman, lodepng usw.

Zur Bewertung der funktionalen Äquivalenz wurden manuell Unit-Tests konstruiert, die eine Zeilenabdeckung von 81,4%-97,7% und eine Funktionsabdeckung von 92,9%-100,0% erreichen.

Bewertungsmetriken

Idiomatizitätsbewertung:

  • Lint Alert Count: Verwendet Rust-Clippy zur Zählung von Warnungen für nicht-idiomatischen Code
  • Unsafe Usage Count: Verwendet Cargo-geiger zur Zählung der Verwendung unsicheren Codes

Korrektheitsbewertung:

  • Compiled: Anteil erfolgreich kompilierter Funktionen
  • Equiv.: Anteil der Funktionen, die Unit-Tests bestehen

Vergleichsmethoden

  • Idiomatizitätsvergleich: CROWN (regelgestützt), PR2 (LLM-Umschreibung)
  • Korrektheitsvergleich: FLOURINE (Fuzzing-verstärkte LLM-Methode)
  • Ablationsexperimente: PTRTRANSPS, PTRTRANSPU, PTRTRANSRA, PTRTRANSEC und weitere Varianten

Implementierungsdetails

  • LLM: ChatGPT-4o, temperature=0
  • Statische Analyse: Clang, Doxygen, SVF-Framework
  • Fehlerkorrektur: Maximal 5 Iterationen
  • Kompilierungsvalidierung: cargo check

Experimentelle Ergebnisse

Hauptergebnisse

Signifikante Verbesserung der Idiomatizität:

  • Im Vergleich zu CROWN: Lint-Warnungen um 94,9% reduziert (6.802→349), Unsafe-Verwendung um 99,9% reduziert (141.866→85)
  • Im Vergleich zu PR2: Lint-Warnungen um 91,8% reduziert (4.272→349), Unsafe-Verwendung um 99,9% reduziert (134.185→85)

Erhebliche Verbesserung der Korrektheit:

  • Im Vergleich zu FLOURINE: Kompilierungserfolgsquote um 28,4% erhöht (98,3% vs. 69,9%), funktionale Äquivalenzquote um 29,3% erhöht (81,6% vs. 52,3%)
  • Kleine Projekte (avl, rgba, ht, bst) erreichen 100% funktionale Äquivalenz

Ablationsexperimente

Ablationsexperimente validieren die Wichtigkeit jeder Komponente:

  • Ohne Zeiger-Semantik (PTRTRANSPS): Äquivalenzquote fällt von 81,6% auf 59,5%, Rückgang von 22,1%
  • Nur Zeiger-Nutzungsinformationen (PTRTRANSRA): Leistung schlechter als vollständige Version
  • Nur Rust-Annotationen (PTRTRANSPU): Ähnlicher Leistungsrückgang
  • Ohne Fehlerkorrektur (PTRTRANSEC): Äquivalenzquote fällt von 81,6% auf 50,8%, Rückgang von 30,8%

Leistungsverteilungsanalyse

PTRMAPPER zeigt stabile Leistung bei unterschiedlichen Komplexitätsgraden:

  • Codezeilen: Stabile Leistung mit zunehmender Komplexität, FLOURINE fällt steil ab
  • Abhängigkeitsbeziehungen: Bei Abhängigkeitsanzahl [16,44) Äquivalenzquote 57,1%, FLOURINE 0%
  • Zeigeranzahl: Bei Zeigeranzahl [20,50) Äquivalenzquote 50,0%, FLOURINE 0%

Fallstudie

Am Beispiel des Quadtree-Projekts wird gezeigt, wie PTRMAPPER komplexe Borrow-Konflikte löst:

  1. Identifiziert, dass der tree-Parameter eine unveränderliche Ausleihe &Quadtree sein sollte
  2. Trennt root in eine veränderliche Ausleihe &mut QuadtreeNode
  3. Extrahiert key_free als unabhängigen Parameter, um Borrow-Konflikte zu vermeiden
  4. Behandelt Eigentümerschafts-Semantiken korrekt

Verwandte Arbeiten

C-zu-Rust-Übersetzungsforschung

  1. Regelgestützte Methoden: Corrode, C2RUST usw., erzeugen große Mengen unsicheren Codes
  2. LLM-basierte Methoden: SPECTRA, FLOURINE usw., mangelt es an globaler Perspektive
  3. Einzelübersetzungs-Methoden: SYZYGY usw., Zeiger-Semantik-Verlust

Vorteile dieses Papiers

  • Erste systematische Modellierung von Zeiger-Semantiken auf Projektebene
  • Kooperative Methode, die statische Analyse und LLM-Generierung kombiniert
  • Signifikante Verbesserung von Sicherheit und Korrektheit

Schlussfolgerung und Diskussion

Hauptschlussfolgerungen

  1. Der C-Rust-Zeiger-Wissensgraph löst effektiv das Problem des Zeiger-Semantik-Verlusts bei der Übersetzung auf Projektebene
  2. Die synergistische Integration von statischer Analyse und LLM verbessert die Übersetzungsqualität erheblich
  3. Inkrementelle Validierung und intelligente Fehlerkorrektur gewährleisten die Zuverlässigkeit der Übersetzung

Einschränkungen

  1. Konstruktionsaufwand: Die Wissensgraph-Konstruktion erfordert zusätzliche statische Analysezeit
  2. Regelabhängigkeit: Die Rust-Annotations-Extraktion hängt von vordefinierten Regeln ab und könnte unvollständig sein
  3. Projektgröße: Die Skalierbarkeit für sehr große Projekte muss noch verifiziert werden
  4. Manuelle Intervention: In komplexen Fällen können noch geringe manuelle Anpassungen erforderlich sein

Zukünftige Richtungen

  1. Optimierung der Wissensgraph-Konstruktionseffizienz
  2. Erweiterung auf weitere Programmiersprachen-Paare
  3. Integration weiterer Programmanalyseverfahren
  4. Erhöhung des Automatisierungsgrades

Tiefgreifende Bewertung

Stärken

  1. Hohe Innovativität: Erste Kombination von Wissensgraph und LLM für Code-Übersetzung, löst grundlegende Probleme bestehender Methoden
  2. Systematische Methode: Vollständige Problemanalyse bis zur Lösungsgestaltung, klare technische Roadmap
  3. Umfassende Experimente: 16 echte Projekte, mehrere Vergleichsmethoden, detaillierte Ablationsexperimente
  4. Signifikante Ergebnisse: Erreicht signifikante Verbesserungen in Sicherheit, Idiomatizität und Korrektheit
  5. Hoher praktischer Wert: Löst praktische Ingenieurprobleme mit starkem Anwendungspotenzial

Mängel

  1. Skalierbarkeitsprobleme: Die rechnerische Komplexität der statischen Analyse könnte die Anwendung auf sehr große Projekte einschränken
  2. Regelkomplettheit: Rust-Annotations-Extraktionsregeln könnten nicht alle Grenzfälle abdecken
  3. Bewertungsbeschränkungen: Hauptsächlich auf mittleren und kleinen Projekten validiert, Leistung bei großen Projekten bedarf weiterer Verifikation
  4. Qualitätsabhängigkeit: Die Methodeneffektivität hängt stark von der Genauigkeit der statischen Analyse ab

Einfluss

  1. Akademischer Beitrag: Bietet ein neues Forschungsparadigma für das Code-Übersetzungsfeld, das Programmanalyse und generative KI kombiniert
  2. Ingenieurwert: Bietet praktische Werkzeuge für die C-zu-Rust-Migration und trägt zur Verbesserung der Softwaresicherheit bei
  3. Technische Inspiration: Das Konzept der KG-gesteuerten LLM kann auf andere Code-Generierungsaufgaben übertragen werden

Anwendungsszenarien

  1. Legacy-System-Migration: Geeignet für Projekte, die C-Codebäsen zu Rust migrieren müssen
  2. Sicherheitskritische Anwendungen: Systeme mit hohen Anforderungen an Speichersicherheit
  3. Automatisierungswerkzeuge: Kann in IDE oder CI/CD-Pipelines integriert werden
  4. Bildung und Schulung: Hilft Entwicklern, Rust-Speichersicherheitskonzepte zu erlernen

Literaturverzeichnis

Das Papier zitiert 76 relevante Arbeiten, die wichtige Arbeiten in den Bereichen Code-Übersetzung, Programmanalyse und große Sprachmodelle abdecken und eine solide theoretische Grundlage für die Forschung bieten.


Gesamtbewertung: Dies ist ein hochqualitatives Softwaretechnik-Forschungspapier, das innovativ Wissensgraphen und große Sprachmodelle kombiniert, um Schlüsselprobleme bei der C-zu-Rust-Übersetzung zu lösen. Die Methodengestaltung ist angemessen, die experimentelle Validierung ist umfassend und die Ergebnisse sind überzeugend. Obwohl es einige Einschränkungen gibt, eröffnet es neue Forschungsrichtungen im Code-Übersetzungsfeld und hat wichtige akademische und praktische Bedeutung.