目录

前言

一、Unsafe的来源

二、Unsafe功能

1.Unsafe Rust 新增了两种称为原始指针的类型

2.相关应用

总结

前言

        在工作中遇到了unsafe相关的知识,被导师问住了,明明之前也看过学过,在项目中却没有对这个概念的敏感度,对应的内容也比较模糊,所以特此整理一篇相关的内容记录记录,和大家一起深入学习……

一、Unsafe的来源

        unsafe是 Rust 语言中的一个关键字,用于标记那些编译器无法自动验证内存安全的代码块。

        Unsafe Rust 存在的原因在于,静态分析本质上是保守的。当编译器试图判断代码是否能保证这些保证,拒绝一些有效的程序总比接受一些无效的好 节目。虽然代码可能还行,但如果Rust编译器没有足够多的信息让人有信心,它会拒绝该代码。在这些情况下,你可以用不安全的代码告诉编译器:“相信我,我知道我是什么 正在做。”不过要注意,使用不安全的Rust要自行承担风险:如果你错误使用不安全的代码,可能因内存不安全而出现问题,例如空指针解调。

        Rust 另一个不安全的另一个原因是底层计算机 硬件本质上是不安全的。如果Rust不让你做不安全的操作,你做不了某些任务。Rust需要允许你做低级系统 编程,比如直接与操作系统交互,甚至 自己编写操作系统。低级系统编程工作 是该语言的目标之一。让我们来探讨一下对不安全能做些什么 Rust及其操作方法。

二、Unsafe功能

        可以通过 unsafe 关键字来切换到不安全 Rust,接着可以开启一个新的存放不安全代码的块。这里有五类可以在不安全 Rust 中进行而不能用于安全 Rust 的操作,它们称之为 “不安全的超能力。” 这些超能力是:

                                        1.解引用裸指针
                                        2.调用不安全的函数或方法
                                        3.访问或修改可变静态变量
                                        4.实现不安全 trait
                                        5.访问 union 的字段

1.Unsafe Rust 新增了两种称为原始指针的类型

        不安全 Rust 有两个被称为 裸指针raw pointers)的类似于引用的新类型。和引用一样,裸指针是不可变或可变的,分别写作 *const T 和 *mut T。这里的星号不是解引用运算符;它是类型名称的一部分。在裸指针的上下文中,不可变 意味着指针解引用之后不能直接赋值。  

从引用同时创建不可变和可变裸指针

fn main() {
let mut num = 5;

let r1 = &num as *const i32;
let r2 = &mut num as *mut i32;
}

        可以在安全代码中创建裸指针,不过不能 解引用 裸指针和读取其指向的数据。现在我们要做的就是对裸指针使用解引用运算符 *,这需要一个 unsafe 块

fn main() {
let mut num = 5;

let r1 = &num as *const i32;
let r2 = &mut num as *mut i32;

unsafe {
    println!("r1 is: {}", *r1);
    println!("r2 is: {}", *r2);
}
}

2.相关应用

        使用extern函数调用外部代码

        Rust 代码可能需要与其他语言编写的代码交互。为此 Rust 有一个关键字,extern,有助于创建和使用 外部函数接口Foreign Function Interface, FFI)。外部函数接口是一个编程语言用以定义函数的方式,其允许不同(外部)编程语言调用这些函数。

下面展示了如何集成 C 标准库中的 abs 函数。extern 块中声明的函数在 Rust 代码中总是不安全的。因为其他语言不会强制执行 Rust 的规则且 Rust 无法检查它们,所以确保其安全是开发者的责任:

文件名: src/main.rs

extern "C" {
    fn abs(input: i32) -> i32;
}

fn main() {
    unsafe {
        println!("Absolute value of -3 according to C: {}", abs(-3));
    }
}

来源:不安全的 Rust - Rust 程序设计语言 中文版


总结

在这个过程中,查阅的资料有限,需要再结合资料进行相关的学习,随时进行知识迭代更新……

更多推荐