UnSafe

这是一个严肃、宏大、复杂、危险的话题。它是如此严重,以至于我写了一整本关于它的书

总而言之,一旦你允许调用其他语言,每种语言实际上都是不安全的,因为你可以让 c 做任意的坏事。是的: Java,Python,Ruby,Haskell... 面对外部函数接口(Foreign Function Interfaces,FFI) ,每个人都非常不安全。

Rust通过将自己分为两种语言来拥抱这个真理:Safe Rust和Unsafe Rust。 到目前为止,我们仅与Safe Rust合作。 它完全是100%安全的...除了它可以FFI进入Unsafe Rust。

Unsafe Rust 是 Safe Rust 的超集。 它在所有语义和规则上都与 Safe Rust完全相同,只允许您做一些额外的事情,这些事情非常不安全,并且可能导致困扰C的可怕未定义行为。

同样,这是一个非常大的话题,有很多有趣的角落案例。我真的不想深入讨论这个问题(好吧,我想。是的。读那本书)。没关系,因为有了链表,我们实际上可以忽略几乎所有的内容。

我们将使用的主要Unsafe工具是原始指针。 原始指针基本上是C的指针。 它们没有固有的别名规则。 他们没有生命。 它们可以为空。 他们可以晃来晃去。 它们可以指向未初始化的内存。 它们可以与整数进行强制转换。 可以将它们强制转换为指向其他类型。 可变性? 几乎所有事情都会发生,这意味着几乎所有事情都会出错。

这是一些不好的东西,老实说,您将过上更加幸福的生活,而不必碰触这些东西。 不幸的是,我们想编写链表,而链表却很糟糕。 这意味着我们将不得不使用不安全的指针。

原始指针有两种:*const T 和 *mut T。它们的意思是来自 C 的 const T* 和 T* ,但我们实际上并不关心 C 认为它们的含义是什么。 您只能将 const *T 取消引用到 &T,但是就像变量的可变性一样,这只是防止不正确使用的皮棉。 最多只是意味着您必须先将 *const 强制转换为 *mut。 尽管如果您实际上没有权限更改指针的引用对象,那么您将会遇到困难。

无论如何,在我们编写一些代码的时候,我们会对此有更好的感觉。现在,*mut T == &unchecked mut T !

Last updated