【Rust】unsafe 代码
系统编程的秘密乐趣在于,在每一种安全语言和精心设计的抽象之下,都存在着极其 unsafe
的机器语言和小技巧,我们也可以用 Rust
来写。
到目前为止,我们介绍的语言可确保程序通过类型、生命周期、边界检查等完全自动地避免内存错误和数据竞争,但是这种自动推断有其局限性,有许多有价值的技术手段是无法被 Rust
认可的。
unsafe
代码告诉 Rust
,程序选择使用它无法保证安全的特性。通过将代码块或函数标记为 unsafe
,可以获得调用标准库中的 unsafe
函数、解引用 unsafe
指针以及调用用其他语言(如 C
和 C++
)编写的函数以及其他能力。
这种跳出安全 Rust
边界的能力使得在 Rust
中实现许多 Rust
最基本的功能成为可能,就像 C
和 C++
用来实现自己的标准库一样。 unsafe
代码允许 Vec
有效地管理其缓冲区、 std::io
能直接和操作系统对话、以及提供并发原语的 std::thread
和 std::sync
。
本节将 unsafe
功能的要点:
Rust
的unsafe
块在安全的Rust
代码和使用unsafe
特性的代码之间建立了界限;可以将函数标记为
unsafe
,提醒调用者存他们必须遵守的额外规范以避免未定义的行为;裸指针及其方法允许不受限制地访问内存,并允许构建
Rust
类型系统原本禁止的数据结构。尽管Rust
的引用是安全但受约束的,但正如任何C
或C++
程序员所知道的,裸指针是一个强大而锋利的工具;了解未定义行为将帮助理解为什么它会产生比仅仅得到错误结果更严重的后果;
unsafe
的Trait
,类似于unsafe
的函数,强加了每个实现必须遵循的规约;