实现 Unsafe Trait

与函数一样,如果您在实现某个 trait 时必须保证特定条件来避免未定义的行为, 您也可以将该 trait 标记为 unsafe

For example, the zerocopy crate has an unsafe trait that looks something like this:

use std::{mem, slice};

/// ...
/// # Safety
/// The type must have a defined representation and no padding.
pub unsafe trait IntoBytes {
    fn as_bytes(&self) -> &[u8] {
        let len = mem::size_of_val(self);
        unsafe { slice::from_raw_parts((&raw const self).cast::<u8>(), len) }
    }
}

// SAFETY: `u32` has a defined representation and no padding.
unsafe impl IntoBytes for u32 {}

在 Rustdoc 中有关 trait 的章节下,有一个标题为 # 安全 的部分介绍了 安全实现 trait 的要求。

The actual safety section for IntoBytes is rather longer and more complicated.

内置的 SendSync trait 都是不安全的。