Function unsafe_intro

Source
pub fn unsafe_intro()
Expand description

§Unsafe Rust 介绍

示例1: Unsafe Rust 是 Safe Rust 的超集

    fn main(){
        unsafe {
            let mut a = "hello";
            let b = &a;
            let c = &mut a;
        }
    }

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 ?