pub fn unsafe_intro()
Expand description
§Unsafe Rust 介绍
示例1: Unsafe Rust 是 Safe Rust 的超集
Unsafe Rust是指,在进行以下五种操作的时候,并不会提供任何安全检查:
- 解引用裸指针。
- 调用unsafe的函数或方法。
- 访问或修改可变静态变量。
- 实现unsafe trait。
- 读写Union联合体中的字段。
解引用裸指针
- Rust提供了const T(不变)和mut T(可变)两种指针类型。因为这两种指针和C语言中的指针十分相近,所以叫其原生指针(Raw Pointer)。
原生指针具有以下特点:
- 并不保证指向合法的内存。比如很可能是一个空指针。
- 不能像智能指针那样自动清理内存。需要像C语言那样手动管理内存。
- 没有生命周期的概念,也就是说,编译器不会对其提供借用检查。
- 不能保证线程安全。
可见,原生指针并不受Safe Rust提供的那一层“安全外衣”保护,所以也被称为“裸指针”。所以,在对裸指针进行解引用操作的时候,属于不安全行为。
Unsafe语法
通过unsafe关键字和unsafe块就可以使用Unsafe Rust,它们的作用如下:
- unsafe关键字,用于标记(或者说声明)函数、方法和trait。
- unsafe块,用于执行Unsafe Rust允许的五种操作。
查看标准库String中的 unsafe 函数from_utf8_unchecked,看看为什么是Unsafe的。
这里最大的风险在于,如果一个函数存在违反“契约”的风险,而开发者并没有使用unsafe关键字将其标记,那该函数就很可能会成为Bug的温床。 被unsafe关键字标记的不安全函数或方法,只能在unsafe块中被调用。
示例2:
static mut COUNTER: u32 = 0;
fn main() {
let inc = 3;
unsafe {
COUNTER += inc;
println!("COUNTER: {}", COUNTER);
}
}
Safe Rust 是基于很多 Unsafe Rust 实现的,那么 Safe Rust 凭什么 Safe ?