逐步废弃并最终移除 Rust 中 static mut 语法的提案
在 Rust Internals 论坛上,有一个关于逐步废弃并最终移除 Rust 中 static mut 语法的提案(Pre—RFC),提议在 2024 年 Rust 版本中开始废弃 static mut 的使用,并在 2027 年版本中完全移除这个语法。(这个提案不涉及 &'static mut)。
主要的动机是:
现有的 static mut 特性难以正确使用(很容易获得别名的独占引用或由于对 static mut 声明的变量进行非同步访问而遇到未定义行为(UB)),并且由于内部可变性生态系统的扩展,static mut 正变得多余。
static mut 旨在提供可以在初始值设置后修改的静态变量。然而,使用 static mut 可能会导致问题,例如违反 Rust 的借用规则,产生两个对同一数据的独占引用,或在多线程中导致数据竞争和未定义行为。
作者建议使用 std::cell::SyncUnsafeCell<T>
替代 static mut,以提高代码的安全性和可审计性。SyncUnsafeCell 虽然仍然是不安全的,但它使得某些原本在 static mut 上不安全的操作(如获取静态的原始指针)变得安全,同时 2024 年 Rust 版本中通过警告(或默认拒绝的 lint)提示 static mut 的废弃,并在 2027 年版本中将其作为硬语法错误处理。这样可以使代码迁移到更安全的版本,并更容易审计潜在的错误。
同时,github 上也有两个关于 static m