FFI in Rust ermöglicht es, Funktionen, die in externen Bibliotheken (z.B. C/C++) deklariert sind, aufzurufen und Rust-Funktionen nach außen zu exportieren. Dazu wird das Schlüsselwort extern verwendet. Anforderungen:
unsafe eingewickelt sein;i32, u64 usw.) zu verwenden;Beispiel für eine Wrapper:
extern "C" { fn abs(input: i32) -> i32; } fn main() { unsafe { println!("{}", abs(-5)); } }
Eine Funktion aus Rust für die Verwendung in C kann so exportiert werden:
#[no_mangle] pub extern "C" fn sum(a: i32, b: i32) -> i32 { a + b }
Frage: Garantiert Rust, dass, wenn man den Aufruf einer C-Funktion in unsafe einwickelt, alles in Bezug auf Threadsicherheit und den Umgang mit UB korrekt funktioniert?
Antwort: Nein! unsafe ist ein Versprechen an den Compiler, dass Sie für die Korrektheit aller Sicherheitsanforderungen (Aliasing, Threadsicherheit, Speicherzugriff) selbst garantieren. Rust führt keine Prüfungen des Codes innerhalb von C durch. Beispielsweise kann ein Race Condition oder UB im Bibliothekscode zur "Zerschlagung" der Runtime einer Rust-Anwendung führen. Selbst wenn Rust-Code kompiliert wird, kann die tatsächliche Ausführung zu einem Absturz führen.
Geschichte
long und i64 übereinstimmen, aber es stellte sich heraus, dass die Größen auf anderen Plattformen nicht übereinstimmten – falsches Lesen von Speicher führte zu Bugs in den Berechnungen.Geschichte
Geschichte
In einem Client-Server-Produkt sprach das Rust-Modul mit einer C-Bibliothek, ohne die Multithread-Sicherheit zu berücksichtigen. Die Bibliothek war nicht threadsicher, und Rust-Programme sprachen gleichzeitig aus verschiedenen Threads darauf zu, was zu Abstürzen und Datenbeschädigung führte.