不安全操作

为了介绍本章内容,我们借用官方文档的一句话, “在基本代码中尽可能减少不安全的代码”("one should try to minimize the amount of unsafe code in a code base.")。记住这句话,接着我们进入学习!在 Rust 中,不安全代码块是用于避开编译器的保护策略;具体地说,不安全代码块主要有 4 方面内容:

  • 解引用裸指针
  • 通过 FFI 调用函数(这个内容在本书其他章节介绍过了)
  • 使用 std::mem::transmute 来强制转型(change type)
  • 内联汇编(inline assembly)

原始指针

原始指针(裸指针) * 和引用 &T 有类似的功能,但引用总是安全的,因为它们保证指向一个有效的数据,这得益于借用检查器(borrow checker)。解引用一个裸指针只能通过不安全代码块中来完成。

fn main() {
    let raw_p: *const u32 = &10;

    unsafe {
        assert!(*raw_p == 10);
    }
}

Transmute(转变)

从一种类型变到另一种类型的允许简单转换,但是两种类型必须拥有相同的大小和排列:

fn main() {
    let u: &[u8] = &[49, 50, 51];

    unsafe {
        assert!(u == std::mem::transmute::<&str, &[u8]>("123"));
    }
}