什么是 Unsafe Rust
概念名称: unsafe 块允许执行编译器无法保证安全的操作,程序员需自行保证正确性。
语法结构:
┌──────────────────────────────────────┐
│ unsafe { │
│ // 不安全操作 │
│ } │
│ │
│ unsafe fn dangerous() { ... } │
│ │
│ 5 种不安全操作: │
│ 1. 解引用裸指针 (*const T, *mut T) │
│ 2. 调用 unsafe 函数 │
│ 3. 访问/修改可变静态变量 │
│ 4. 实现 unsafe Trait │
│ 5. 访问 union 的字段 │
└──────────────────────────────────────┘最简示例
rust
▶ Runfn main() {
let mut x = 5;
let raw = &mut x as *mut i32;
unsafe {
*raw = 10; // 解引用裸指针
}
println!("x = {}", x);
}Unsafe Rust 能做什么
┌─────────────────────────────────────────────────────┐
│ Unsafe Rust 能做什么 │
├─────────────────────────────────────────────────────┤
│ │
│ Safe Rust 无法做到的事: │
│ 1. 解引用裸指针 │
│ 2. 调用不安全函数或方法 │
│ 3. 访问或修改可变静态变量 │
│ 4. 实现不安全 Trait │
│ 5. 访问 union 的字段 │
│ │
│ 何时使用 Unsafe? │
│ • 与 C 代码交互(FFI) │
│ • 操作系统系统调用 │
│ • 性能关键代码 │
│ • 实现底层抽象(如智能指针) │
│ │
│ 重要原则: │
│ • 最小化 unsafe 块 │
│ • 在安全接口内封装 unsafe │
│ • 文档说明为什么 unsafe 是安全的 │
│ │
└─────────────────────────────────────────────────────┘为什么用它?
rust
▶ Run// 没有 unsafe:无法与 C 库交互
// extern "C" { fn c_function(); } // 必须在 unsafe 中调用
// 有 unsafe:可以安全封装 C 接口
pub fn safe_wrapper() {
// 内部使用 unsafe,外部提供安全接口
unsafe {
// c_function(); // C 函数调用
}
}关键代码说明:
| 代码 | 含义 | 为什么这样写 |
|---|---|---|
unsafe { ... } | 不安全块 | 告诉编译器"我知道风险" |
*mut T / *const T | 裸指针 | 不受借用规则约束,需手动管理 |
unsafe fn | 不安全函数 | 调用者必须在 unsafe 块中调用 |
static mut | 可变静态变量 | 全局可变,多线程不安全 |