Implementando Traits Inseguros

Assim como nas funções, você pode marcar um trait como unsafe se a implementação precisa garantir condições particulares para evitar comportamento indefinido.

Por exemplo, o crate zerocopy tem um trait inseguro que parece algo assim:

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

/// ...
/// # Segurança
/// O tipo precisa ter uma representação definida e nenhum preenchimento.
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),
            )
        }
    }
}

// SEGURANÇA: `u32` possui uma representação definida e sem preenchimento.
unsafe impl AsBytes for u32 {}
This slide should take about 5 minutes.

Deve haver uma seção # Safety no Rustdoc para o trait explicando os requisitos para ser implementado com segurança.

Na verdade, a seção de segurança para AsBytes é bem mais longa e complicada.

Os traits integrados Send e Sync são inseguros.