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

Rust中通过原始指针写入&mut指向的变量是否为未定义行为?

Rust中可变指针与引用别名的未定义行为分析

问题场景

在Rust中,&mut引用的别名会直接导致未定义行为,但以下通过原始指针与引用结合的场景中,修改指针指向的值是否属于未定义行为?

代码示例:

fn main() {
    let mut data = 12345;
    let p = &mut data as *mut _;
    let r = &mut data;
    println!("r = {}", r);
    unsafe {
        *p = 54321; // <- 这是否属于未定义行为?
    }
    println!("r = {}", r);
}

核心结论

这段代码中的*p = 54321操作确实属于未定义行为,原因如下:

  • Rust内存安全的核心规则是:活跃的&mut T引用拥有对目标数据的独占访问权。当let r = &mut data;执行后,r作为活跃的可变引用,独占了data的所有访问权限。
  • 虽然p是由&mut data转换而来的原始指针,但在r的生命周期内,通过p修改data的行为,本质上违反了&mut引用的独占性规则——这直接触发了Rust的未定义行为,无论操作是简单赋值还是复合运算(比如之前提到的+=)。
  • 原始指针在unsafe块中允许别名,但前提是不能破坏Rust的核心内存安全规则。活跃&mut引用的独占性是不可违反的关键规则之一。

关键注意点

  • 即便当前编译器版本下代码能正常运行,也不代表它是安全的。未定义行为意味着编译器可以对代码进行任意优化,在不同版本、不同编译模式下可能产生不可预测的结果。
  • 如果需要同时用指针和引用操作同一数据,必须确保指针操作时没有活跃的&mut引用存在,比如可以通过限制&mut引用的生命周期来实现。

内容的提问来源于stack exchange,提问作者Yusuke NOJIMA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 13:12:42