% Трансмутации
Уберись с нашей дороги, система типов! Мы будем интерпретировать эти биты по- своему или умрем пытаясь! Хотя эта книга и про создание небезопасных вещей, я действительно не могу не подчеркнуть, что вы должны глубоко задуматься над поиском Другого способа, кроме того, что рассматривается в этом разделе. Это действительно, по-настоящему, самая ужасно небезопасная вещь, которую вы можете сделать в Rust. Это как если бы железнодорожное полотно охраняла зубная нить.
mem::transmute<T, U>
берет значение типа T
и интерпретирует его, как тип U
.
Единственное ограничение - размер T
и U
должен совпадать. Варианты, которые
вызывают Неопределенное Поведение этим, сводят с ума.
- Первое и самое главное, создание экземпляра любого типа с неправильным состоянием вызовет огромный хаос, который невозможно будет предсказать.
- Трансмутация имеет перегруженный тип возврата. Если вы не укажете тип возврата она создаст какой-то неизвестный тип, удовлетворяющий выводу типов.
- Создание примитива с неправильным значением - это неопределённое поведение (НП)
- Трансмутации между non-repr(C) типами - это НП
- Трансмутации & в &mut - это НП
- Трансмутации & в &mut - это всегда НП!
- Нет, ты не можешь так делать!
- Нет, ты не особенный!
- Трансмутации в ссылку без явного указания времени жизни создает unbounded-lifetimes
mem::transmute_copy<T, U>
каким-то образом стал даже более дико небезопасным
чем это. Он копирует size_of<U>
байтов из &T
и интерпретирует их как U
.
Проверка длины, которая была у mem::transmute
пропала (потому что копировать
префикс может оказаться допустимым), хотя если U
длиннее, чем T
- это
Неопределенное Поведение.
Вы можете получить большую часть этой функциональности, используя явное приведение указателей.