Rust入坑指南:居安思危

任何事情都是相对的,就像Rust给我们的印象一直是安全、快速,但实际上,完全的安全是不可能实现的。因此,Rust中也是会有不安全的代码的。

严格来讲,Rust语言可以分为Safe RustUnsafe Rust。Unsafe Rust是Safe Rust的超集。在Unsafe Rust中并不会禁用任何的安全检查,Unsafe Rust出现的原因是为了让开发者可以做一些更加底层的操作。这些事情本身也是不安全的,如果仍然要进行Rust的安全检查,那么就无法进行这些操作。

在进行下面这5种操作时,Unsafe Rust不会进行安全检查。

  • 解引用原生指针
  • 调用unsafe的函数或方法
  • 访问或修改可变的静态变量
  • 实现unsafe的trait
  • 读写联合体中的字段

基础语法

Unsafe Rust的关键字是unsafe,它可以用来修饰函数、方法和trait,也可以用来标记代码块。

标准库中也有不少函数是unsafe的。例如String中的from_utf8_unchecked()函数。它的定义如下:

pub unsafe fn from_utf8_unchecked(bytes: Vec<u8>) -> String {
  String { vec: bytes }
}

这个函数被标记为unsafe的原因是函数并没有检查传入参数是否是合法的UTF-8序列。也就是提醒使用者注意,使用这个函数要自己保证参数的合法性。

用unsafe标记的trait也比较常见,在前面我们见过的Send和Sync都是unsafe的trait。它们被用来保证线程安全, 将其标记为unsafe是告诉开发者,如果自己实现这两个trait,那么代码就会有安全风险。

我们在调用unsafe函数或方法时,需要使用unsafe代码块。

fn main() {
    let sparkle_heart = vec![240, 159, 146, 150];
    
    let sparkle_heart = unsafe {
        String::from_utf8_unchecked(sparkle_heart)
    };

    assert_eq!("
上一篇:session fixation攻击


下一篇:Java 中的 CAS 操作