17
Unsafe Rust:这活我自己担着
Unsafe Rust · Raw Pointers · FFI
Rust 的安全检查太严,少数底层场景(FFI、性能关键、实现安全抽象内部)确实绕不过去。这时候 unsafe 就是告诉编译器:"这活我自己担着,你别拦我。"
论unsafe 不是为所欲为
unsafe 只解锁五件事:① 解引用裸指针;② 调用 unsafe 函数/方法;③ 访问或修改可变静态变量;④ 实现 unsafe trait;⑤ 访问 union 字段。它不会关掉借用检查,也不代表"这里写啥都行"——你只是自己负责保证内存安全不变量。
fn main() {
let mut num = 5;
// 裸指针:不受借用规则约束,可为 null、可别名
let r1 = &mut num as *mut i32;
let r2 = &num as *const i32;
unsafe {
// 解引用裸指针:危险,编译器不再检查
*r1 = 10;
println!("{}", *r2); // 10
}
}
// unsafe fn:调用者必须在 unsafe 块里调
unsafe fn dangerous(ptr: *const i32) -> i32 {
*ptr
}
$ cargo run
10
unsafe 最佳实践
① 最小化 unsafe 范围,能不用就不用;② 把 unsafe 封装在安全 API 后面,外面的人无感;③ 加 // SAFETY: ... 注释说明为什么这里安全;④ 用 cargo +nightly miri 跑未定义行为检查。标准库、操作系统绑定、高性能库里才有 unsafe,99% 的业务代码碰不到它。