Rust ↔ C
| Аспект | Rust | C |
|---|---|---|
| Ошибки | Result<T, E>, Option<T> | Магические возвращаемые значения, выходные параметры, глобальный errno |
| Строки | &str/String (UTF-8, длина известна) | char* с завершающим нулём, кодировка не определена |
| Нулевые значения (nullability) | Явно через Option<T> | Любой указатель может быть null |
| Владение | Аффинные типы, времена жизни | Соглашения |
| Обратные вызовы | Замыкания Fn/FnMut/FnOnce | Указатель на функцию + void* userdata |
| Паники | Раскрутка стека (или abort) | Аварийное завершение (abort) |
Ошибки: нужно преобразовывать Result по соглашениям C; легко забыть проверить ошибки на стороне C.
Строки: стоимость преобразования; нулевые байты в строках Rust приводят к обрезанию; проверка UTF-8 при входе.
Нулевые значения: каждый указатель из C нужно проверить, чтобы создать Option<NonNull<T>>, что подразумевает блоки unsafe или затраты во время выполнения.
Владение: время жизни объектов нужно документировать и соблюдать вручную.
Обратные вызовы: замыкания нужно раскладывать на указатель на функцию и контекст; время жизни контекста задаётся вручную.
Паники: паника, пересекающая границу FFI, — неопределённое поведение; её нужно перехватывать на границе с помощью catch_unwind.