Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Rust ↔ C

АспектRustC
Ошибки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.