我正在开发单核嵌入式芯片。在C和C++中,通常会静态定义可变的值,以便可以全局使用。对应的Rust代码大致如下:
static mut MY_VALUE: usize = 0;
pub fn set_value(val: usize) {
unsafe { MY_VALUE = val }
}
pub fn get_value() -> usize {
unsafe { MY_VALUE }
}
现在任何地方都可以调用免费函数
get_value
和set_value
。我认为在单线程嵌入式Rust中完全安全,但我找不到明确的答案。我只关心不需要分配或销毁(如此处示例中的原语)的类型。
唯一的注意事项是编译器或处理器以意外的方式重新排序访问(可以使用volatile访问方法解决),但这本质上是否不安全?
编辑:
该书建议只要我们能保证没有多线程数据竞争(在这里显然是这种情况),这样就可以安全地进行操作。
对于全局可访问的可变数据,很难确保没有数据竞争,这就是为什么Rust认为可变静态变量是不安全的原因。
文档的措辞没那么明确,它只是暗示访问可变静态变量可能有多种不安全的方式,例如在多线程上下文中由于数据竞争而导致未定义行为。
Nomicon认为,只要你不以某种方式解引用错误的指针,这就应该是安全的。
unsafe
包装的代码不是一个有效的安全抽象”。我相信我以前经常看到它被用在那个上下文中。对我来说,“unsound”可能包括更广泛的正确性问题。但如果我搞混了,请指点一下参考资料。 - JMAAunsafe
的。 - Ian S.unsafe
和unsound
的官方描述:https://doc.rust-lang.org/beta/reference/behavior-considered-undefined.html - Finomnis