Реалізація небезпечних трейтів

Як і у випадку з функціями, ви можете позначити трейт unsafe, якщо реалізація повинна гарантувати певні умови, щоб уникнути невизначеної поведінки.

Наприклад, крейт zerocopy має небезпечний трейт, який виглядає приблизно так:

use std::mem::size_of_val;
use std::slice;

/// ...
/// # Безпека
/// Тип повинен мати визначене представлення і не мати заповнень.
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),
            )
        }
    }
}

// БЕЗПЕКА: `u32` має визначене представлення і не має заповнення.
unsafe impl AsBytes for u32 {}
This slide should take about 5 minutes.

У Rustdoc має бути розділ # Safety для трейту, що пояснює вимоги до безпечної реалізації функції.

Фактичний розділ безпеки для AsBytes довший і складніший.

Вбудовані Send та Sync трейти є небезпечними.