Небезопасная реализация
Ключевое слово unsafe в контексте реализации трейта
позволяет объявить небезопасную реализацию трейта для типа.
Это необходимо, когда реализация трейта содержит операции,
корректность которых компилятор не может гарантировать
автоматически. Программист берёт на себя ответственность
за соблюдение всех инвариантов, связанных с данным трейтом.
Небезопасная реализация чаще всего используется для низкоуровневых абстракций, работы с памятью, FFI и других задач, где требуется ручное управление безопасностью.
Синтаксис
unsafe impl Trait for Type
{
// реализация методов
}
Пример
Давайте создадим небезопасную реализацию трейта,
связанного с передачей данных между потоками.
Для этого объявим структуру и реализуем для неё
маркерный трейт Send с помощью unsafe impl:
struct MyBox(*mut u8);
unsafe impl Send for MyBox {}
fn main()
{
let b = MyBox(0 as *mut u8);
println!("Send impl ok");
let _ = b;
}
Результат выполнения кода:
Send impl ok
Пример
Давайте создадим собственный трейт с небезопасным
методом и реализуем его для конкретного типа.
При этом реализация также помечается как unsafe:
unsafe trait UnsafeTrait
{
fn do_something(&self) -> i32;
}
struct MyStruct
{
value: i32,
}
unsafe impl UnsafeTrait for MyStruct
{
fn do_something(&self) -> i32
{
self.value
}
}
fn main()
{
let s = MyStruct { value: 42 };
let res = unsafe { s.do_something() };
println!("{}", res);
}
Результат выполнения кода:
42
Пример
Давайте реализуем небезопасный трейт для типа, который содержит необработанный указатель. Это распространённый случай при работе с FFI:
unsafe trait RawAccess
{
fn raw_value(&self) -> u8;
}
struct RawHolder
{
ptr: *const u8,
}
unsafe impl RawAccess for RawHolder
{
fn raw_value(&self) -> u8
{
unsafe { *self.ptr }
}
}
fn main()
{
let val: u8 = 7;
let holder = RawHolder { ptr: &val };
let res = unsafe { holder.raw_value() };
println!("{}", res);
}
Результат выполнения кода:
7
Смотрите также
-
ключевое слово
unsafe,
которое открывает блок небезопасного кода -
unsafe fn,
которое объявляет небезопасную функцию -
unsafe trait,
который объявляет небезопасный трейт -
transmute,
которая небезопасно преобразует тип одного значения в другой