后面这句话来自官方文档,“在代码中使用尽量最少使用不安全的代码”。时刻铭记在心这句话,然后就可以开始了!在Rust中使用不安全声明会在编译时对这段代码绕过保护。具体来说,不安全声明主要用于下面四种情况:

  1. 解引用原始指针
  2. 调用不安全的方法或函数(见前面章节中通过FFI调用函数)
  3. 访问或修改静态可变的变量
  4. 实现不安全接口

原始指针*和&T函数的引用类似,但是引用由于借用检查总可以保证其安全性,他总是指向有效的数据。解引用一个原始指针只能在一个不安全块中完成。

fn main() {

    let raw_p: *const u32 = &10;


    unsafe {

        assert!(*raw_p == 10);

    }

}
调用不安全的函数

函数可以被声明为不安全的(unsafe),这意味着有程序员来保证其安全性而不是由编译器来保证其安全性。下面的示例展示了std::slice::from_raw_parts的用法,它会根据第一个元素的指针和设定的长度创建一个切片并返回。

use std::slice;


fn main() {

    let some_vector = vec![1, 2, 3, 4];


    let pointer = some_vector.as_ptr();

    let length = some_vector.len();


    unsafe {

        let my_slice: &[u32] = slice::from_raw_parts(pointer, length);


        assert_eq!(some_vector.as_slice(), my_slice);

    }

}

对于std::slice::from_raw_parts来说,假定条件之一是传递进来的指针必须指向有效的内存,并且指向的数据类型必须正确。如果这些条件不能被满足,则程序的行为将是不确定的,无人知晓会发生什么。

内容解析

Rust的不安全机制是其安全保证的一部分,它允许你在需要时突破编译器的安全检查,但要求开发者自行确保代码的安全性。

重要原则

尽量少使用不安全的代码:这是Rust官方文档强调的核心原则

责任转移:使用unsafe时,安全责任从编译器转移到开发者

前置条件:如from_raw_parts要求指针必须指向有效内存且类型正确

为什么需要不安全代码

不安全代码不是为了绕过Rust的限制,而是为了:

  1. 实现编译器无法验证的安全操作
  2. 与底层系统或外部代码交互
  3. 在某些情况下获取性能优势

注意:unsafe代码块应该尽量小,并且腰围其安全性提供明确的文档说明。

原文链接地址:https://doc.rust-lang.org/rust-by-example/unsafe.html

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐