Rust ↔ C

観点RustC
エラーResult<T, E>, Option<T>特別な戻り値、出力パラメータ、グローバル errno
文字列&str/String(UTF-8、長さが分かる)ヌル終端の char*、エンコーディングは未定義
ヌル許容性Option<T> により明示どのポインタも null になりうる
所有権アフィン型、ライフタイム慣習
コールバックFn/FnMut/FnOnce クロージャ関数ポインタ + void* userdata
パニックスタックアンワインド(または abort)abort

エラー: C の慣習に従うために Result を変換しなければならない。C 側では エラーの確認を忘れやすい。

文字列: 変換コストがかかる。Rust の文字列中のヌルバイトは切り詰めを引き起こす。 入力時には UTF-8 の検証が必要。

ヌル許容性: Option<NonNull<T>> を作るには、C からのすべてのポインタを検査 しなければならず、unsafe ブロックまたは実行時コストを伴う。

所有権: オブジェクトのライフタイムを手動で文書化し、保証しなければならない。

コールバック: クロージャを fn ポインタ + コンテキストに分解しなければならない。コンテキストの ライフタイムは手動管理となる。

パニック: FFI 境界をまたぐパニックは未定義動作であり、境界で catch_unwind によって捕捉しなければならない。