编写 Unsafe 函数

如果您自己编写的函数需要满足特定条件以避免未定义的行为, 您可以将这些函数标记为 unsafe

/// Swaps the values pointed to by the given pointers.
///
/// # Safety
///
/// The pointers must be valid and properly aligned.
unsafe fn swap(a: *mut u8, b: *mut u8) {
    let temp = *a;
    *a = *b;
    *b = temp;
}

fn main() {
    let mut a = 42;
    let mut b = 66;

    // Safe because ...
    unsafe {
        swap(&mut a, &mut b);
    }

    println!("a = {}, b = {}", a, b);
}

实际上,我们不会这样使用指针,因为使用引用可以安全地达到相同的目的。

请注意,在不安全函数中,可以在没有 unsafe 代码块的情况下使用不安全代码。我们可以 使用 #[deny(unsafe_op_in_unsafe_fn)] 来禁止此行为。请尝试添加该命令,看看会出现什么情况。