unsafe トレイトの実装

関数と同様に、未定義動作を避けるために実装が特定の条件を保証しなければならない場合、 トレイトを unsafe としてマークできます。

たとえば、zerocopy クレートには、 次のような unsafe トレイトがあります。

// 著作権 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0

use std::{mem, slice};

/// ...
/// # Safety
/// この型は、表現が定義されており、パディングを含んではなりません。
pub unsafe trait IntoBytes {
    fn as_bytes(&self) -> &[u8] {
        let len = mem::size_of_val(self);
        let slf: *const Self = self;
        unsafe { slice::from_raw_parts(slf.cast::<u8>(), len) }
    }
}

// SAFETY: `u32` は表現が定義されており、パディングがありません。
unsafe impl IntoBytes for u32 {}

そのトレイトの Rustdoc には、そのトレイトを安全に実装するための要件を説明する # Safety セクションがあるべきです。

実際の IntoBytes の安全性に関するセクションは、これよりもかなり長く複雑です。

組み込みの Send トレイトと Sync トレイトは unsafe トレイトです。