TL;DR

  • C のシンボルは、1 つのグローバルな名前空間に存在する。
  • FFI 境界での問題を減らすには、unsafe な FFI コードを safe なラッパで包み、メモリの確保と解放を常に境界のどちらか一方で行い、サイズの決まった整数型を使う。
  • panic! は未定義動作を引き起こしうるので、FFI 境界を越えさせない。

内容

FFI 境界で守ること

FFI(Foreign Function Interface)では、関数だけでなくデータ構造もやりとりできる。FFI 境界で問題が起きる可能性を減らすには、次のことを守る。

  • unsafe な FFI コードを safe なラッパで包む。
  • メモリの確保と解放は、常に境界のどちらか一方で行う。Rust 側で行うなら RAII パターンを使える(項目11)。
  • uint32_t のようにサイズの決まった整数型を使う。
  • CString、CStr、Box::into_raw と Box::from_raw など、標準ライブラリの FFI 用のヘルパを使う。
  • panic! を FFI 境界の外に出さない(項目18)。

詳細

詳しくは次のページにまとめた。

  1. Rust から C の関数を呼び出す
  2. Rust から C のライブラリを呼び出す
  3. Rust から C のデータにアクセスする
  4. Rust と C の FFI で生じるメモリ安全性の問題
  5. C から Rust のコードを呼び出す

キーワード