You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

可变引用与指针别名:为何违反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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 21:50:25