FFI w Rust pozwala na wywoływanie funkcji zadeklarowanych w zewnętrznych bibliotekach (np. C/C++) oraz eksportowanie funkcji Rust na zewnątrz. W tym celu używa się słowa kluczowego extern. Wymagania:
unsafe;i32, u64 itp.);Przykład opakowania:
extern "C" { fn abs(input: i32) -> i32; } fn main() { unsafe { println!("{}", abs(-5)); } }
Eksportowanie funkcji z Rust do użycia w C można zrobić w ten sposób:
#[no_mangle] pub extern "C" fn sum(a: i32, b: i32) -> i32 { a + b }
Pytanie: Czy Rust gwarantuje, że jeśli owiniesz wywołanie funkcji C w unsafe, wszystko będzie działać poprawnie pod względem bezpieczeństwa w wątkach i wychwytywania UB?
Odpowiedź: Nie! unsafe to obietnica dla kompilatora, że sam odpowiadasz za spełnienie wszystkich wymagań bezpieczeństwa (aliasing, bezpieczeństwo wątków, dostęp do pamięci). Rust nie przeprowadza kontroli kodu wewnątrz C. Na przykład, race condition lub UB w kodzie biblioteki może "zepsuć" runtime programów Rust. Nawet jeśli kod Rust jest kompilowany, rzeczywiste wykonanie może doprowadzić do awarii.
Historia
long i i64 są zgodne, lecz okazało się, że rozmiary były różne na innych platformach — niewłaściwe odczytywanie pamięci doprowadziło do błędów w obliczeniach.Historia
Historia
W produkcie klient-serwerowym moduł Rust odwoływał się do biblioteki C, nie uwzględniając bezpieczeństwa wielowątkowego. Biblioteka nie była thread-safe, a programy Rust odwoływały się do niej z różnych wątków jednocześnie, co prowadziło do awarii i uszkodzenia danych.