Реалізація небезпечних трейтів
Як і у випадку з функціями, ви можете позначити трейт unsafe
, якщо реалізація повинна гарантувати певні умови, щоб уникнути невизначеної поведінки.
Наприклад, крейт zerocopy
має небезпечний трейт, який виглядає приблизно так:
use std::mem::size_of_val; use std::slice; /// ... /// # Безпека /// Тип повинен мати визначене представлення і не мати заповнень. pub unsafe trait AsBytes { fn as_bytes(&self) -> &[u8] { unsafe { slice::from_raw_parts( self as *const Self as *const u8, size_of_val(self), ) } } } // БЕЗПЕКА: `u32` має визначене представлення і не має заповнення. unsafe impl AsBytes for u32 {}
This slide should take about 5 minutes.
У Rustdoc має бути розділ # Safety
для трейту, що пояснює вимоги до безпечної реалізації функції.
Фактичний розділ безпеки для AsBytes
довший і складніший.
Вбудовані Send
та Sync
трейти є небезпечними.