1.1 Safe 与 Unsafe 如何交互
Safe 与 Unsafe 如何划分责任并协同工作
2 分钟阅读
译文 · 基于 The Rustonomicon
原文链接: https://doc.rust-lang.org/nomicon/meet-safe-and-unsafe.html
若能不必操心底层实现细节,那该多好。 谁会真的在意空元组占多少空间呢?遗憾的是,有时这确实重要,我们不得不关心。开发者开始在意实现细节,最常见的原因是性能;但更重要的是,当直接与硬件、操作系统或其他语言打交道时,这些细节会变成正确性问题。
当实现细节在「安全」编程语言里开始重要时,程序员通常有三条路:
对最后一条路,程序员往往选 C。要与只提供 C 接口的系统对接,这常常是必要的。
不幸的是,C 用起来极不安全(有时也有充分理由),而在与另一种语言互操作时,这种不安全会被放大。必须小心确保 C 与另一语言对「发生了什么」有一致理解,且互不踩踏。
这与 Rust 有何关系?
嗯,与 C 不同,Rust 是一门安全编程语言。
但,与 C 一样,Rust 也是一门不安全编程语言。
更准确地说,Rust 同时包含 安全与不安全两种编程语言。
Rust 可看作两种语言的组合:Safe Rust 与 Unsafe Rust。名字名副其实:Safe Rust 是安全的;Unsafe Rust 则不然。事实上,Unsafe Rust 让我们能做非常不安全的事——Rust 作者会恳请你别做,但我们会做。
Safe Rust 才是真正的 Rust 编程语言。若你只写 Safe Rust,就永远不必操心类型安全或内存安全。你不会遇到悬垂指针、释放后使用,或任何其他未定义行为(Undefined Behavior,简称 UB)。
标准库也提供了足够工具,让你能用纯惯用的 Safe Rust 写出高性能应用与库。
但也许你要与另一种语言对话;也许在写标准库未暴露的底层抽象;也许在编写标准库(它完全用 Rust 写成);也许要做类型系统不理解的事,只好直接摆弄比特。这时你需要 Unsafe Rust。
Unsafe Rust 与 Safe Rust 规则与语义相同,只是额外允许一些明确不安全(Definitely Not Safe)的操作(下一节会定义)。
这种分离的价值在于:我们获得像 C 这类不安全语言的益处——对实现细节的底层控制——又不必承受把它与完全不同的安全语言集成时的大多数问题。
仍有一些问题——尤其我们必须意识到类型系统所假设的性质,并在任何与 Unsafe Rust 交互的代码中审计它们。本书的目的就是教你这些假设以及如何管理它们。
Safe 与 Unsafe 如何划分责任并协同工作
Unsafe Rust 相对 Safe Rust 多出的能力
编写与审阅 Unsafe 代码的实践要点