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.