ProgramlamaSistem Geliştirici

Rust'ta sistem FFI (Yabancı Fonksiyon Arayüzü) nasıl çalıştığını açıklayın. C'den fonksiyonları güvenli bir şekilde çağırmak için hangi gereksinimler ve tuzaklar vardır?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

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:

  • Tüm FFI çağrıları unsafe ile sarılmalıdır;
  • ABI (Uygulama İkili Arayüzü) uyuşmalıdır (genellikle "C");
  • Veri türleri uyumlu olmalıdır — sabit boyutlu temel türlerin (i32, u64 vb.) kullanılması önemlidir;
  • Bellek yönetimi — sahiplik, bellek sızıntıları ve çifte serbest bırakma konusunda çok dikkatli olunmalıdır.

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 }

Kandırmaca Sorusu

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

Finansal veri sağlayıcısında bir ekip, C kütüphanesini FFI aracılığıyla entegre etti ama tür boyutlarını kontrol etmedi. x86_64'de 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

Bir geliştirici, geçen tamponlar için işaretçileri unutarak C API'si için bir sarıcı oluşturdu. Rust otomatik olarak belleği serbest bıraktığı için, C fonksiyonu bazen zaten serbest bırakılan bellekle işlem yaptı ve bu da çöküşlere ve arızalara neden oldu.

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ı.