可变引用与指针别名:为何违反Rust别名规则的代码可通过MIRI?
为什么这段Rust代码能通过MIRI检查?
你误解了Rust别名规则的核心:规则禁止的是同时存在两个活跃的可变别名,而非“只要持有可变引用和可变指针就违规”,你的代码并没有触发这个冲突,所以MIRI允许它通过。
具体分析:
- 当你把可变引用
r转换为原始指针ptr后,只要不同时通过两者对同一数据进行可变访问,就不会违反内存安全规则。 - 你的代码是交替使用
r和ptr执行写入:- 调用
r.push('a')时,只有可变引用r在活跃地修改数据,ptr此时没有被用来访问; - 调用
(*ptr).push('b')时,只有指针ptr在活跃修改,r没有处于正在访问的状态; - 后续的
r.push('c')和(*ptr).push('d')也是同样的交替逻辑,每次只有一个别名在操作数据。
- 调用
MIRI的核心职责是检测并发的可变别名访问(即同一时间有多个可变路径修改数据),而交替使用不属于这种情况,因此不会被判定为未定义行为。
需要提醒的是:这种写法虽然当前安全,但属于unsafe代码的风险区域——如果后续代码不小心在同一周期内同时使用r和ptr修改数据,就会立刻触发UB。unsafe代码的安全性完全依赖开发者手动保证,编译器和MIRI只能检测明确的冲突。
内容的提问来源于stack exchange,提问作者rubo
相关产品推荐
相关产品推荐

