目录前言一、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.实现不安全 trait5.访问 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.rsextern C { fn abs(input: i32) - i32; } fn main() { unsafe { println!(Absolute value of -3 according to C: {}, abs(-3)); } }来源不安全的 Rust - Rust 程序设计语言 中文版总结在这个过程中查阅的资料有限需要再结合资料进行相关的学习随时进行知识迭代更新……