BorrowCheck › Ядро языка Rust

Unsafe, UB, FFI

Сырые указатели, контракт unsafe, каталог UB, repr и ABI, extern "C", проверка через Miri.

Тема объясняет, что разрешает блок unsafe и какую ответственность он перекладывает на автора: компилятор перестаёт проверять лишь несколько операций, а проверка заимствований продолжает работать. Вопросы о сырых указателях (raw pointers) проверяют, чем указатель отличается от ссылки, как add шагает по элементам, а не по байтам, чем wrapping_add отличается от add, зачем нужен &raw mut и почему указатель на срез занимает два слова. Раздел о контракте разбирает безопасные обёртки над unsafe, неустойчивые (unsound) функции, небезопасные трейты и атрибуты, а также блоки extern и функции safe в редакции 2024. Каталог неопределённого поведения (undefined behavior, UB) охватывает недопустимые битовые образы, чтение неинициализированной памяти через MaybeUninit, запись через приведённую &T, unreachable_unchecked и то, что к UB не относится. Разделы о repr и FFI объясняют, что гарантируют repr(C), repr(transparent) и repr(packed), почему нельзя брать ссылку на поле packed, какие типы пересекают границу extern "C" и что происходит с паникой на этой границе. Последний раздел показывает, какие ошибки находит Miri, например обращение к памяти после переаллокации, и где проходят границы его применимости.

44 вопроса: базовый уровень — 18, средний — 23, углублённый — 3. 6 справок, 26 источников.

Разделы

  1. Сырые указатели
  2. Контракт unsafe
  3. Каталог неопределённого поведения
  4. repr и ABI
  5. FFI и extern "C"
  6. Проверка через Miri

Предыдущая тема: Асинхронность · Следующая тема: Макросы