不安全(unsafe)Rust
:不提供强制的内存安全保证。
介绍
存在原因:
- 解决静态分析保守问题,通过
unsafe rust
程序员承担对象风险时实现额外 超能力
- Rust 需要底层系统编程,但计算机硬件本身是不安全的
unsafe 超能力
通过 unsafe
关键字来切换 unsafe rust
,可以执行4个动作:
- 解引用
原始指针(raw point)
- 可变的
*mut T
,如 let r1 = &mut num as *mut i32;
- 不可变的(解引用后不能直接对其进行复制)
*const T
,如 let r1 = &num as *const i32;
- 存在原因
- 与 C 语音进行交互的接口,使用
extern
关键字调用 外部函数接口(FFI, Foreign Function Interface)
- 构建借用检查器无法理解的安全抽象
- 调用 unsafe 函数或方法:在函数或方法前加
unsafe
关键的函数或方法
- 必须在 unsafe 块里调用
- 满足特定的条件(见官网)
unsafe fn unsafe_fn {
...
}
fn some_fn() {
unsafe {
unsafe_fn();
}
}
- 访问或修改可变的静态变量(static)
static SCRESMING_SNAKE_CASE: &str = "hello world!";
- 实现
unsafe trait
- 该 trait 只能在
unsafe
代码库中实现
- 声明示例:
unsafe trait Foo {
// ...
}
unsafe impl Foo for i32 {
// ...
}
说明:
unsafe
并没有关闭借用检查或停用其他安全检查
- 任何内存安全相关的错误必须留着 unsafe 块里
- 尽可能隔离 unsafe 代码,如封装在安全的抽象里,对外提供安全的 API
unsafe 代码使用
- 开发者需要保证 unsafe 代码的正确,因为编译器无法保证 unsafe 代码的安全
- 出现问题,需要优先排查 unsafe 代码