Rust 不安全代码:规则、风险与应对策略
1. 不安全代码的风险与特性
1.1 操作序列引发的内存不安全
某些操作序列可能轻易导致内存不安全。例如,克隆 Rc<Box> 并将其发送到另一个线程,由于两个线程未正确同步对 Rc 引用计数的访问,可能都会尝试释放 Box ,从而引发问题。
1.2 安全与不安全特性的判断
Unpin 特性是一个很好的反例。即使不正确实现 Unpin 可能会编写触发内存不安全的不安全代码,但完全安全的代码不会因 Unpin 的实现而触发内存不安全。判断一个特性是否安全并不总是容易的,必要时可先将特性设为不安全,后续确认安全后再更改,但这是向后不兼容的更改。
值得注意的是,仅仅因为一个特性的不正确(甚至恶意)实现可能会造成严重破坏,并不一定意味着要将其设为不安全。 unsafe 标记应主要用于突出内存不安全的情况,而非仅仅是可能触发业务逻辑错误的情况。例如, Eq 、 Ord 、 Deref 和 Hash 特性都是安全的,即使恶意实现可能会导致很多代码出现问题,但这并不意味着它们应该是不安全的。
1.3 不安全代码的责任
不安全代码被允许执行某些操作,但前提是必须安全地执行。例如,解引用原始指针时,必须确保该指针在当时是有效的,
超级会员免费看
订阅专栏 解锁全文
949

被折叠的 条评论
为什么被折叠?



