Небезопасная функция
Небезопасная функция - это функция, объявленная с помощью ключевого слова unsafe.
Такая функция может выполнять операции, которые компилятор Rust не способен
проверить на безопасность: разыменование сырых указателей, вызов других
небезопасных функций, доступ к изменяемым статическим переменным, чтение
объединений (union) и другие. Параметром функция принимает любые значения,
которые нужны для её логики, но вызывать её можно только внутри блока
unsafe или из другой небезопасной функции.
Синтаксис
unsafe fn function_name(parameters) -> ReturnType
{
// тело функции
}
Пример
Давайте объявим небезопасную функцию, которая разыменовывает сырой указатель и возвращает его значение:
unsafe fn deref_ptr(ptr: *const i32) -> i32
{
*ptr
}
fn main()
{
let x = 42;
let ptr = &x as *const i32;
let res = unsafe { deref_ptr(ptr) };
println!("{}", res);
}
Результат выполнения кода:
42
Пример
Давайте объявим небезопасную функцию, которая меняет значение по сырому изменяемому указателю:
unsafe fn set_value(ptr: *mut i32, value: i32)
{
*ptr = value;
}
fn main()
{
let mut x = 10;
let ptr = &mut x as *mut i32;
unsafe { set_value(ptr, 99) };
println!("{}", x);
}
Результат выполнения кода:
99
Пример
Давайте объявим небезопасную функцию, которая вызывает другую
небезопасную функцию std::ptr::read для чтения значения
из сырого указателя:
unsafe fn read_value(ptr: *const i32) -> i32
{
std::ptr::read(ptr)
}
fn main()
{
let x = 7;
let ptr = &x as *const i32;
let res = unsafe { read_value(ptr) };
println!("{}", res);
}
Результат выполнения кода:
7
Смотрите также
-
ключевое слово
unsafe,
которое открывает блок небезопасных операций -
ключевое слово
unsafe trait,
который объявляет небезопасный трейт -
ключевое слово
unsafe impl,
который реализует небезопасный трейт -
функция
read,
которая читает значение из сырого указателя