Cを安全なRustへコンパイルするための形式化された方法
(arxiv.org)-
Cを安全なRustへコンパイルする
-
Rust言語の人気は急速に高まっている一方、多くの重要なコードベースは依然としてCで書かれており、手作業で書き換えるのは現実的ではない。したがって、CをRustに自動変換することが魅力的な代替案として浮上している。
-
既存のさまざまな研究では、Rustの複数の機能(例:
unsafe)を使ってCの扱う範囲を拡大する方向に進んでいる。しかし、 自動化の可能性は魅力的であるが、unsafeに依存するコードを生成すると、Rustが提供するメモリ安全性の保証が失効し、既存のコードベースをメモリ安全な言語へ移植する主要な利点がなくなる。 -
我々は異なるアプローチを模索し、Cを安全なRustへ翻訳する方法を研究した。つまり、Rustの型システムに準拠して、メモリ安全性を容易に保証できるコードを生成することである。
-
我々の研究は複数の独自の貢献を含む。
- Cの一部を安全なRustへ型主導で翻訳する
- Rustのスライスとスライス演算を用いてCのポインタ算術を表現するための「分割木」に基づく新しい静的解析
- どの借用が可変であるべきかを正確に推論する解析
- Rustの非所有・所有アロケーションの区別と互換性のあるC構造体型に対するコンパイル戦略
-
我々はこの方法論を既に形式的に検証されたCコードベースに適用した:HACL*暗号ライブラリ、EverParseのバイナリパーサおよびシリアライザ。サポートするCのサブセットで、これら2つのアプリケーションを安全なRustへ翻訳するのに十分であることを示した。
-
評価結果、Rustのエイリアス規則を逸脱するいくつかの部分については、自動化された外科的リライトで十分であり、挿入した戦略的なコピーが性能に与える影響はごくわずかであることを確認した。
-
特にHACL*に対してこのアプローチを適用した結果、現代のあらゆるアルゴリズムを実装する80,000行の検証済み暗号ライブラリが純粋なRustで実装された。これは初めての事例である。
1件のコメント
Hacker Newsのコメント
Rust へ移植する際にいくつかの結論に達した
形式的に検証された既存の C コードベースと、一般的なシステム向け C コードベースは異なる
研究者たちは 2002 年に安全な C 方言である Cyclone に関する論文を発表し、C から Cyclone へ移植する際に安全性バグを発見した
Rust への単純な変換は安全な部分と不安全な部分を生み出し、手作業は不安全な領域の安全性検証に集中できる
C の一部だけをコンパイルするアプローチには低い期待しか持てない
Zig の C 変換機能との比較に対する疑問
C2Rustが形式的に正しいコードを生成できるかどうかへの問いC ライブラリが正常に動作しているなら、Rust の不安全性を使って移植する価値があるかもしれない
高い最適化レベルが Rust の速度を大きく向上させなかった点が興味深い