> For the complete documentation index, see [llms.txt](https://chapin666.gitbook.io/too-many-list-zh/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://chapin666.gitbook.io/too-many-list-zh/yi-ge-bu-an-quan-de-dui-lie/unsafe.md).

# UnSafe

这是一个严肃、宏大、复杂、危险的话题。它是如此严重，以至于我写了[一整本关于它的书](https://doc.rust-lang.org/nightly/nomicon/)。

总而言之，一旦你允许调用其他语言，每种语言实际上都是不安全的，因为你可以让 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 !
