楼层: 首页/ 软件技术/ Rust 语言基础/ Unsafe Rust:这活我自己担着
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% 的业务代码碰不到它。