Unsafeなトレイトの実装
関数と同様に、未定義の動作を回避するために実装で特定の条件を保証する必要がある場合は、トレイトを unsafe としてマークできます。
For example, the zerocopy crate has an unsafe trait that looks something like this:
use std::{mem, slice};
/// ...
/// # Safety
/// 型には定義された表現が必要で、パディングがあってはなりません。
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 {}
This slide should take about 5 minutes.
Rustdoc には、トレイトを安全に実装するための要件について説明した # Safety セクションが必要です。
The actual safety section for IntoBytes is rather longer and more complicated.
組み込みの Send トレイトと Sync トレイトはアンセーフです。