Rust'ta FFI, dış kütüphanelerde (örneğin C/C++) tanımlanan fonksiyonları çağırmayı ve Rust fonksiyonlarını dışarıya aktarmayı sağlar. Bunun için extern anahtar kelimesi kullanılır. Gereksinimler:
unsafe ile sarılmalıdır;i32, u64 vb.) kullanılması önemlidir;Sarıcı örneği:
extern "C" { fn abs(input: i32) -> i32; } fn main() { unsafe { println!("{}", abs(-5)); } }
C'de kullanmak için Rust'tan bir fonksiyon dışarı aktarmak şöyle yapılabilir:
#[no_mangle] pub extern "C" fn sum(a: i32, b: i32) -> i32 { a + b }
Soru: Rust, C fonksiyonu çağrısını unsafe ile sarmalamanın her zaman doğru bir şekilde çalışacağını ve UB'yi yakalayacağını garanti eder mi?
Cevap: Hayır! unsafe, derleyiciye güvenliğin tüm gereksinimlerini (aliasing, thread güvenliği, belleğe erişim) kendinizin sağladığını taahhüt eden bir sözdür. Rust, C içindeki kodu kontrol etmez. Örneğin, bir yarış durumu veya kütüphane kodundaki UB, Rust programının çalışma zamanını "bozabilir". Rust kodu derlense bile, gerçek yürütme çökme ile sonuçlanabilir.
Hikaye
long ve i64 değerlerinin aynı olduğu bekleniyordu ama diğer platformlarda boyutların uyuşmadığı ortaya çıktı — yanlış bellek okuma hesap dönüştürmeleri hatalarına yol açtı.Hikaye
Hikaye
Bir istemci-sunucu ürününde Rust modülü, C kütüphanesine çoklu iş parçacığı güvenliğini göz önünde bulundurmadan erişti. Kütüphane thread-safe değildi ve Rust programları aynı anda farklı iş parçacıklarından buna erişti ve bu da çöküşlere ve veri bozulmalarına yol açtı.