非安全块

unsafe-blocks.md
commit: 4a2bdf896cd2df370a91d14cb8ba04e326cd21db
本章译文最后维护日期:2020-11-16

一个代码块可以以关键字 unsafe 作为前缀,以允许在安全(safe)函数中调用非安全(unsafe)函数或对裸指针做解引用操作。

当程序员确信某些潜在的非安全操作实际上是安全的,他们可以将这段代码(作为一个整体)封装进一个非安全(unsafe)块中。编译器将认为在当前的上下文中使用这样的代码是安全的。

非安全块用于封装外部库、直接操作硬件或实现语言中没有直接提供的特性。例如,Rust 提供了实现内存安全并发所需的语言特性,但是线程和消息传递的实现(没在语言中实现,而)是在标准库中实现的。

Rust 的类型系统是动态安全条款(dynamic safety requirements)的保守近似值,因此在某些情况下使用安全代码会带来性能损失。例如,双向链表不是树型结构,那在安全代码中,只能妥协使用引用计数指针表示。通过使用非安全(unsafe)块,可以将反向链接表示为原始指针,这样只用一层 box封装就能实现了。