不安全(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) - 构建借用检查器无法理解的安全抽象
- 与 C 语音进行交互的接口,使用
- 可变的
- 调用 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代码库中实现 - 声明示例:
- 该 trait 只能在
unsafe trait Foo {
// ...
}
unsafe impl Foo for i32 {
// ...
}说明:
unsafe并没有关闭借用检查或停用其他安全检查- 任何内存安全相关的错误必须留着 unsafe 块里
- 尽可能隔离 unsafe 代码,如封装在安全的抽象里,对外提供安全的 API
unsafe 代码使用
- 开发者需要保证 unsafe 代码的正确,因为编译器无法保证 unsafe 代码的安全
- 出现问题,需要优先排查 unsafe 代码