实现 Unsafe Trait
与函数一样,如果您在实现某个 trait 时必须保证特定条件来避免未定义的行为, 您也可以将该 trait 标记为 unsafe
。
例如,zerocopy
crate 包含一个不安全的 trait, 大致内容是这样的:
use std::mem::size_of_val; use std::slice; /// ... /// # Safety /// The type must have a defined representation and no padding. 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), ) } } } // SAFETY: `u32` has a defined representation and no padding. unsafe impl AsBytes for u32 {}
This slide should take about 5 minutes.
在 Rustdoc 中有关 trait 的章节下,有一个标题为 # 安全
的部分介绍了 安全实现 trait 的要求。
实际上,与 AsBytes
相关的安全说明远比这里展示的更详尽、更复杂。
内置的 Send
和 Sync
trait 都是不安全的。