实现 Unsafe Trait

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

例如,zerocopy crate 包含一个不安全的 trait, 大致内容是这样的

  1. use std::mem::size_of_val;
  2. use std::slice;
  3. /// ...
  4. /// # Safety
  5. /// The type must have a defined representation and no padding.
  6. pub unsafe trait AsBytes {
  7. fn as_bytes(&self) -> &[u8] {
  8. unsafe {
  9. slice::from_raw_parts(
  10. self as *const Self as *const u8,
  11. size_of_val(self),
  12. )
  13. }
  14. }
  15. }
  16. // SAFETY: `u32` has a defined representation and no padding.
  17. unsafe impl AsBytes for u32 {}

This slide should take about 5 minutes.

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

实际上,与 AsBytes 相关的安全说明远比这里展示的更详尽、更复杂。

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