gpt4 book ai didi

rust - 在不安全的 rust 中通过 *mut T 来突变 &T 是 UB 吗?

转载 作者:行者123 更新时间:2023-11-29 08:26:29 25 4
gpt4 key购买 nike

let r = 42;
unsafe {
let p = &r as *const i32 as *mut i32;
*p += 1;
}
println!("{}", r);

上面的代码是UB吗? rustc(同时假设 r 是一个 &i32)是否有可能以最终成为 UB< 的方式对其进行优化?

这个呢↓

let rc = Rc::new(42);
unsafe {
let p = &*rc as *const i32 as *mut i32;
*p += 1;
}
println!("{}", rc);

Rc 是一个 single-threaded引用计数指针,因此它不是线程安全的。
假设上面的代码是在单线程中执行的,它会以 UB 结束吗?

最佳答案

两种情况都绝对是 UB。

这里的主要问题是对共享引用背后的值的任何更改都是非法的,UnsafeCell 除外。内部值(value)。编译器可以轻松优化第一种情况下的更改,只需替换 r进入println打电话。

第二种情况有点棘手,但它基于相同的事实。请注意表达式 &*r , 其中r类型为 Rc<T> , 类型为 &T ( playground ):

use std::rc::Rc;

fn test<T>(r: Rc<T>) {
let _: () = &*r; // error: expected (), found &T
}

诀窍在于 Rc<T>取消引用 T , 所以 *r类型为 T .

因此,不可变引用再次被视为可变引用。

关于rust - 在不安全的 rust 中通过 *mut T 来突变 &T 是 UB 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55980289/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com