禁止引用 static mut
🚧 2024 版本尚未发布,因此本节仍在“建设中”。
总结
static_mut_refs
lint 现在是一个无法禁用的硬错误。这可以防止获取对static mut
的共享或可变引用。
详情
不再允许获取对 static mut
的引用
#![allow(unused)] fn main() { static mut X: i32 = 23; static mut Y: i32 = 24; unsafe { let y = &X; // ERROR: reference of mutable static let ref x = X; // ERROR: reference of mutable static let (x, y) = (&X, &Y); // ERROR: reference of mutable static } }
仅仅获取违反 Rust 可变性 XOR 别名要求的此类引用始终是*瞬时的* 未定义行为,**即使从未读取或写入该引用**。此外,维护 static mut
的可变性 XOR 别名需要*全局推理代码*,这在面对重入和/或多线程时尤其困难。
替代方案
强烈建议尽可能使用提供*内部可变性*的*不可变* static
类型,该类型在某些*局部推理的抽象*(这大大降低了确保维护 Rust 的可变性 XOR 别名要求的复杂性)之后。
在不可能进行局部推理抽象的情况下,因此您仍然被迫全局推理对 static
变量的访问,您现在必须使用可以通过 addr_of_mut!
宏获得的原始指针。通过首先获取原始指针而不是直接获取引用,(安全要求)通过该指针进行的访问对于 unsafe
开发人员来说将更加熟悉,并且可以推迟到/限制在较小的代码区域。
迁移
🚧 此功能的自动迁移尚未实现。