FFI в Rust позволяет вызывать функции, объявленные во внешних библиотеках (например, C/C++), и экспортировать Rust-функции наружу. Для этого используется ключевое слово extern. Требования:
unsafe;i32, u64 и др.);Пример обертки:
extern "C" { fn abs(input: i32) -> i32; } fn main() { unsafe { println!("{}", abs(-5)); } }
Экспортировать функцию из Rust для использования в C можно так:
#[no_mangle] pub extern "C" fn sum(a: i32, b: i32) -> i32 { a + b }
Вопрос: Гарантирует ли Rust, что если обёрнуть вызов C функции в unsafe, всё будет работать корректно в плане потокобезопасности и отлова UB?
Ответ: Нет! unsafe — это обещание компилятору, что вы сами ручаетесь за корректность всех требований безопасности (aliasing, потокобезопасность, доступ к памяти). Rust не проводит проверок кода внутри C. Например, race condition или UB в коде библиотеки может "сломать" runtime Rust-программы. Даже если Rust-код компилируется, реальное выполнение может привести к аварийному завершению.
История
long и i64 совпадают, но оказалось, что размеры не совпали на других платформах — неправильное чтение памяти привело к багам в расчётах.История
История
В клиент‑серверном продукте Rust модуль обращался к C-библиотеке, не учтя multi-thread safety. Библиотека не была thread-safe, а Rust-проги обращались к ней из разных потоков одновременно, что вылилось в краши и повреждение данных.