-
Kompilieren von C in sicheres Rust
-
Die Popularität von Rust steigt rasant, aber viele wichtige Codebasen sind immer noch in C geschrieben, und es ist nicht realistisch, diese manuell neu zu schreiben. Daher erscheint die automatische Übersetzung von C nach Rust als attraktive Alternative.
-
Mehrere bestehende Arbeiten nutzen zunehmend verschiedene Funktionen von Rust (z. B.
unsafe), um immer größere Teile von C abzudecken. Obwohl die Aussicht auf vollständige Automatisierung attraktiv ist, wird die Speichersicherheitsgarantie von Rust außer Kraft gesetzt, wenn Code erzeugt wird, der vonunsafeabhängt; damit geht der Hauptvorteil verloren, eine bestehende Codebasis in eine speichersichere Sprache zu portieren. -
Wir erforschen einen anderen Weg: die Übersetzung von C in sicheres Rust, also die Erzeugung von Code, der das Rust-Typsystem einhält und damit Speichersicherheit einfach garantieren kann.
-
Unsere Forschung umfasst mehrere neuartige Beiträge:
- Typorientierte Übersetzung von Teilen von C nach sicherem Rust
- Eine neue statische Analyse auf Basis eines "Split-Tree", mit der sich C-Pointerarithmetik mithilfe von Rust-Slices und Slice-Operationen ausdrücken lässt
- Eine Analyse, die exakt ableitet, welche Borrowings mutabel sein müssen
- Eine Kompilierungsstrategie für C-Strukturtypen, die mit der Unterscheidung zwischen non-owning- und owning-Zuweisung in Rust kompatibel ist
-
Wir wenden diese Methodik auf formal verifizierte C-Codebasen an: die Kryptobibliothek HACL* sowie den Binär-Parser und den Serializer von EverParse. Wir zeigen, dass die unterstützte Teilmenge von C ausreicht, um beide Anwendungen in sicheres Rust zu übersetzen.
-
Die Auswertung zeigt, dass bei einigen Verstößen gegen die Aliasing-Regeln von Rust eine automatisierte, gezielte Umformung ausreicht; der Einfluss der eingefügten strategischen Kopien auf die Performance ist gering.
-
Insbesondere bei der Anwendung auf HACL* führte unser Ansatz dazu, dass eine verifizierte Kryptobibliothek mit 80.000 Zeilen, die moderne Algorithmen implementiert, vollständig in reinem Rust geschrieben wurde. Dies ist der erste Fall dieser Art.
1 Kommentare
Hacker News Kommentar
Beim Portieren von Projekten auf Rust habe ich ein paar Schlussfolgerungen gezogen
Eine formell verifizierte C-Codebasis unterscheidet sich von einer typischen System-C-Codebasis
2002 veröffentlichten Forscher einen Beitrag über Cyclone, einen sicheren C-Dialekt, und fanden dabei bei der Portierung von C nach Cyclone Sicherheitsfehler
Eine einfache Übersetzung nach Rust kann sichere und unsichere Teile erzeugen; manuelle Arbeit kann sich darauf konzentrieren, die Sicherheit der unsicheren Bereiche zu prüfen
Ich habe wenig Hoffnung auf den Ansatz, nur einen kleinen Teil von C zu kompilieren
Neugier auf den Vergleich mit Zigs C-Umwandlungsfunktion
Frage, ob
C2Rustformal korrekten Code erzeugen kannWenn eine C-Bibliothek funktioniert, kann es sinnvoll sein, sie mit Rusts
unsafezu migrierenInteressanterweise hat eine hohe Optimierungsstufe die Geschwindigkeit von Rust nicht wesentlich verbessert
O3funktioniert