FFI in Rust maakt het mogelijk om functies aan te roepen die zijn gedefinieerd in externe bibliotheken (zoals C/C++), en om Rust-functies naar buiten te exporteren. Hiervoor wordt het sleutelwoord extern gebruikt. Vereisten:
unsafe;i32, u64 enz.);Voorbeeld van een wrapper:
extern "C" { fn abs(input: i32) -> i32; } fn main() { unsafe { println!("{}", abs(-5)); } }
Een functie uit Rust exporteren voor gebruik in C kan zo:
#[no_mangle] pub extern "C" fn sum(a: i32, b: i32) -> i32 { a + b }
Vraag: Garandeert Rust dat als je een aanroep naar een C-functie omhulld in unsafe, alles correct werkt qua threadveiligheid en het vangen van UB?
Antwoord: Nee! unsafe is een belofte aan de compiler dat je zelf garant staat voor de juistheid van alle veiligheidsvereisten (aliasing, threadveiligheid, toegang tot geheugen). Rust voert geen controles uit op de code binnen C. Bijvoorbeeld, een race condition of UB in de bibliotheekcode kan de runtime van het Rust-programma "breken". Zelfs als de Rust-code compileert, kan de daadwerkelijke uitvoering leiden tot een crash.
Verhaal
long en i64 overeenkwamen, maar het bleek dat de groottes niet overeenkwamen op andere platforms — onjuiste geheugenlezing leidde tot bugs in berekeningen.Verhaal
Verhaal
In een client-server product benaderde een Rust-module de C-bibliotheek zonder rekening te houden met multi-thread veiligheid. De bibliotheek was niet thread-safe, en Rust-programma's benaderden deze gelijktijdig vanuit verschillende threads, wat resulteerde in crashes en gegevensbeschadiging.