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)。
詳細
詳しくは次のページにまとめた。
- Rust から C の関数を呼び出す
- Rust から C のライブラリを呼び出す
- Rust から C のデータにアクセスする
- Rust と C の FFI で生じるメモリ安全性の問題
- C から Rust のコードを呼び出す