Реалізація небезпечних трейтів
Як і у випадку з функціями, ви можете позначити трейт unsafe, якщо реалізація повинна гарантувати певні умови, щоб уникнути невизначеної поведінки.
Наприклад, крейт zerocopy має небезпечний трейт, який виглядає приблизно так:
use std::{mem, slice};
/// ...
/// # Безпека
/// Тип повинен мати визначене представлення і не мати заповнень.
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) }
}
}
// БЕЗПЕКА: `u32` має визначене представлення і не має заповнення.
unsafe impl IntoBytes for u32 {}
This slide should take about 5 minutes.
У Rustdoc має бути розділ # Safety для трейту, що пояснює вимоги до безпечної реалізації функції.
Фактичний розділ безпеки для IntoBytes довший і складніший.
Вбудовані Send та Sync трейти є небезпечними.