主题
Unsafe Rust
Rust 最大的特点之一是内存安全。在默认情况下,Rust 的所有权系统、借用检查器和生命周期规则确保了程序在编译阶段就消除大多数内存错误。但在某些特定场景中,我们需要绕过这些限制,此时就需要使用 unsafe
。
为什么需要 Unsafe?
Rust 的安全性是以严格的编译规则为代价的。有些底层操作(如直接操作内存、调用 C 函数、实现底层性能优化)在安全 Rust 中无法实现。unsafe
提供了一个逃逸舱口,让开发者可以“承诺自己小心”。
Unsafe 的使用场景
rust
unsafe {
let ptr = 0x12345 as *const i32;
println!("读取指针值: {}", *ptr);
}
你可以在以下五种操作中使用 unsafe
:
- 解引用裸指针 (
*const T
或*mut T
) - 调用
unsafe
函数或方法 - 实现
unsafe
trait - 访问或修改可变的静态变量
- 使用
extern
函数接口与其他语言(如 C)交互
Unsafe 不等于不安全
使用 unsafe
并不意味着代码一定有问题,而是 Rust 编译器不再帮你检查这些部分的安全性,责任转移给开发者。合理地封装 unsafe
块,可以在保证整体安全的前提下获得底层性能。
代码演示
vue
## 代码演示
<RustPlayground :code="code" />
<script setup>
const code = `unsafe fn dangerous() {
println!("这是一个 unsafe 函数");
}
fn main() {
unsafe {
dangerous();
}
let ptr: *const i32 = &10;
unsafe {
println!("解引用裸指针: {}", *ptr);
}
}`;
</script>
小结
unsafe
是 Rust 的一部分,用于处理特殊的底层任务。- 应谨慎使用,并尽可能局部化、封装 unsafe 块。
- 安全 Rust 是默认,unsafe 是必要时的工具,而非常规做法。