Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Небезопасные функции 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)]. Попробуйте добавить и посмотрите, что произойдёт.