Skip to content

什么是 Unsafe Rust

概念名称: unsafe 块允许执行编译器无法保证安全的操作,程序员需自行保证正确性。

语法结构:
┌──────────────────────────────────────┐
│  unsafe {                             │
│      // 不安全操作                    │
│  }                                    │
│                                       │
│  unsafe fn dangerous() { ... }        │
│                                       │
│  5 种不安全操作:                      │
│  1. 解引用裸指针 (*const T, *mut T)  │
│  2. 调用 unsafe 函数                 │
│  3. 访问/修改可变静态变量             │
│  4. 实现 unsafe Trait                │
│  5. 访问 union 的字段                │
└──────────────────────────────────────┘

最简示例

rust
fn main() {
    let mut x = 5;
    let raw = &mut x as *mut i32;
    
    unsafe {
        *raw = 10;  // 解引用裸指针
    }
    println!("x = {}", x);
}
▶ Run

Unsafe Rust 能做什么

┌─────────────────────────────────────────────────────┐
│          Unsafe Rust 能做什么                        │
├─────────────────────────────────────────────────────┤
│                                                     │
│  Safe Rust 无法做到的事:                            │
│  1. 解引用裸指针                                    │
│  2. 调用不安全函数或方法                            │
│  3. 访问或修改可变静态变量                          │
│  4. 实现不安全 Trait                                │
│  5. 访问 union 的字段                               │
│                                                     │
│  何时使用 Unsafe?                                   │
│  • 与 C 代码交互(FFI)                              │
│  • 操作系统系统调用                                  │
│  • 性能关键代码                                      │
│  • 实现底层抽象(如智能指针)                        │
│                                                     │
│  重要原则:                                          │
│  • 最小化 unsafe 块                                  │
│  • 在安全接口内封装 unsafe                           │
│  • 文档说明为什么 unsafe 是安全的                     │
│                                                     │
└─────────────────────────────────────────────────────┘

为什么用它?

rust
// 没有 unsafe:无法与 C 库交互
// extern "C" { fn c_function(); }  // 必须在 unsafe 中调用

// 有 unsafe:可以安全封装 C 接口
pub fn safe_wrapper() {
    // 内部使用 unsafe,外部提供安全接口
    unsafe {
        // c_function();  // C 函数调用
    }
}
▶ Run

关键代码说明:

代码含义为什么这样写
unsafe { ... }不安全块告诉编译器"我知道风险"
*mut T / *const T裸指针不受借用规则约束,需手动管理
unsafe fn不安全函数调用者必须在 unsafe 块中调用
static mut可变静态变量全局可变,多线程不安全