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 источников.
Разделы
- Сырые указатели
- Контракт
unsafe - Каталог неопределённого поведения
reprи ABI- FFI и
extern "C" - Проверка через Miri
Предыдущая тема: Асинхронность · Следующая тема: Макросы