RUST编程学习-碎片2-Unsafe
目录
前言
在工作中遇到了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 程序设计语言 中文版
总结
在这个过程中,查阅的资料有限,需要再结合资料进行相关的学习,随时进行知识迭代更新……
更多推荐

所有评论(0)