克诺德斯博客音频 |
阅读时间: 4 分钟
不安全的Rust。听起来与我们对Rust的了解相矛盾,因为_Rust_是最安全和最节省内存的语言之一。它没有垃圾收集器,因为它不需要。Rust_有很好的借用和所有权规则,可以照顾到所有的内存安全问题。它是领先的语言之一。 超过9家公司,包括Dropbox、Coursera、Figma、npm、微软、Cloudflare、Facebook、Amazon和Discord,都在使用Rust做这样或那样的事情。但是,什么是_不安全的Rust_和_Raw pointers。它是需要担心的还是危险的东西?我们将在本篇和接下来的博客中看到和了解不安全的Rust。
简介
我们都知道, Rust的速度非常快,而且内存效率高,没有_运行时_ 或_垃圾收集器_。但是有时候,当Rust编译器 不确定你的代码是否安全,或者没有足够的信息来确定时,它就不会让你运行你的代码。Rust编译器相信拒绝一些有效的代码,而不是接受一个可能导致_内存泄漏_的代码。
如果我们确信我们编写的代码是有效的,不会引起任何问题,我们可以使用Rust的一个非常强大的功能,那就是 Unsafe Rust。但是如果我们使用了 不安全的Rust,我们就要对未来任何与内存有关的问题负完全的责任,比如解读一个空指针。
如何使用不安全的?
让我们了解一下如何才能使用 不安全的Rust的终极力量。记住一件事,当我说不安全的Rust的终极力量时,它并不意味着你可以在不安全块中做任何事情。它不会禁用借款检查器或Rust的任何其他安全功能。你在不安全块中可以做的事情有
- 解除对一个原始指针的引用
- 调用一个不安全的函数或方法
- 访问或修改一个可变静态变量
- 实现一个不安全的特性
- 访问联合体的字段
这些是在使用不安全的Rust时不会被检查的点。
我们将在接下来的博客中看到所有这些在不安全的Rust中有效的点。但在这篇博客中,我将讨论第一点。它是关于取消引用原始指针。到现在为止,我们已经知道了引用和智能指针,这是新的东西。让我们先简单介绍一下原始指针。
原始指针
在不安全的Rust中,除了引用和智能指针,我们还有两种新的指针,它们被称为原始指针。_原始指针_可以像引用一样是可变和不可变的。我们可以通过以下方式定义原始指针 ***const T**和 *mut T.
一个由*const T, 表示的不可改变的原始指针,在解除引用后不能被直接分配给它。要记住的关于原始指针的主要一点是,我们可以在_同一时间_对 _同一位置_拥有可变和不可变的原始指针。这一点与引用不同。
我们可以这样定义原始指针 -let ptr = &num as *const u32;
这将创建一个原始指针,指向_u32_类型的num变量的内存位置。
解除对一个原始指针的引用
现在我们对原始指针有了一个概念,我们现在可以看看在哪里可以使用不安全的Rust。让我们看一个例子来了解一下。
请看下面的代码
let mut value = 10;
let immutable_raw_pointer = &value as *const i32;
let mutable_raw_pointer = &mut value as *mut i32;
如果我们仔细看一下,在_同一个内存_位置上有不可变和可变的指针。如果我们试图解除对 这些指针的引用,我们会得到一个编译错误。
试着运行下面几行代码。
print!("value is: {}", *immutable_raw_pointer);
print!("value is: {}", *mutable_raw_pointer);
你会看到下面的 错误信息。
如果你观察错误信息,它说
"dereference of raw pointer is unsafe and requires unsafe function or block"
Rust编译器知道这段代码会导致一些内存问题。
解决该错误
我们通过使用一个不安全块来解决这个错误,向编译器保证我们对任何问题负责。我们只是把打印命令放在发生解读原始指针的地方,让编译器知道不要担心这些命令。
unsafe{
print!("value is: {}", *immutable_raw_pointer);
print!("value is: {}", *mutable_raw_pointer);
}
现在代码编译成功了。不安全块阻止了编译器检查块中的内容,因为我之前说过,解引用原始指针是其中之一。因此,代码的编译没有任何问题。
这就是关于原始指针和不安全Rust的全部内容。我们将在接下来的博客中学习更多关于不安全的Rust。所以请继续关注。
如果你想阅读更多这样的内容? 订阅Rust Times电子报,每两周一次,直接在你的收件箱中收到洞察力和最新的更新。订阅Rust Times Newsletter:https://bit.ly/2Vdlld7。