» Rust快速入门 » 2. 高级篇 » 2.8 Unsafe 不安全操作

Unsafe 不安全操作

在代码库中,应尽量减少不安全代码的使用。Rust 中的不安全注解用于绕过编译器设置的保护机制。

原始指针

原始指针 * 具有与引用 &T 类似的功能,但由于没有借用检查器,故不能保证它们有指向有效数据。 这也是为什么只能在 unsafe 不安全块内对原始指针解引用的原因。

fn main() {
    let x = 42;
    let raw_ptr: *const i32 = &x;

    // 解引用原始指针
    unsafe {
        let value = *raw_ptr;
        println!("Dereferenced value: {}", value);
    }
}

如果不在 unsafe 块中执行此操作,将触发错误:

error[E0133]: dereference of raw pointer is unsafe and requires unsafe function or block

调用不安全函数

有些函数必须声明为 unsafe 才可调用,因为 Rust 与其他语言编写的代码(例如 C)交互,或者处理原始指针等操作被视为不安全。

在 Rust 中,调用不安全函数涉及将调用封装在不安全块中,以向编译器指示你对代码的正确性和安全性负责。

// 定义一个不安全函数
unsafe fn unsafe_function(value: i32) {
    println!("Unsafe function called with value: {}", value);
}

fn main() {
    // 在不安全块中调用不安全函数
    unsafe {
        unsafe_function(58);
    }
}

内联汇编

Rust 通过 asm! 宏提供内联汇编支持。

use std::arch::asm;

fn main() {
  let i: u64 = 3;
  let o: u64;
  unsafe {
    asm!(
        "mov {0}, {1}",
        "add {0}, 5",
        out(reg) o,
        in(reg) i,
    );
  }
  assert_eq!(o, 8);
}

了解有关 asm 操作数的更多信息,参见 Rust手册

代码挑战

尝试修改代码以实现数字的交换。

Loading...
> 此处输出代码运行结果
上页
下页