Небезопасные функции Rust
Собственные функции можно пометить как unsafe, если им нужны особые предусловия, чтобы избежать неопределённого поведения.
// Copyright 2025 Google LLC
// SPDX-License-Identifier: Apache-2.0
/// Меняет местами значения, на которые указывают заданные указатели.
///
/// # Safety
///
/// Указатели должны быть допустимыми, правильно выровненными и не должны иначе
/// использоваться на протяжении вызова функции.
unsafe fn swap(a: *mut u8, b: *mut u8) {
// SAFETY: Вызывающий код обещал, что указатели допустимы, правильно выровнены
// и не имеют другого доступа.
unsafe {
let temp = *a;
*a = *b;
*b = temp;
}
}
fn main() {
let mut a = 42;
let mut b = 66;
// SAFETY: Указатели должны быть допустимыми, выровненными и уникальными, потому что они
// получены из ссылок.
unsafe {
swap(&mut a, &mut b);
}
println!("a = {}, b = {}", a, b);
}
На самом деле для функции swap указатели не нужны: это можно сделать безопасно, через ссылки.
Обратите внимание, что Rust 2021 и более ранние редакции разрешают небезопасный код внутри небезопасной функции без блока unsafe. В редакции 2024 это изменилось. В старых редакциях это можно запретить с помощью #[deny(unsafe_op_in_unsafe_fn)]. Попробуйте добавить и посмотрите, что произойдёт.