rust - UB 是否通过不安全的生锈中的 *mut T 来突变 &T?
问题描述
let r = 42;
unsafe {
let p = &r as *const i32 as *mut i32;
*p += 1;
}
println!("{}", r);
是上面的代码UB
吗?是否有机会rustc
(假设r
是 a &i32
)会以最终结果为的方式优化它UB
?
这个呢↓
let rc = Rc::new(42);
unsafe {
let p = &*rc as *const i32 as *mut i32;
*p += 1;
}
println!("{}", rc);
Rc 是一个单线程引用计数指针,因此它不是线程安全的。
假设上面是在单个线程中执行的,它最终会是UB
?
解决方案
这两种情况都绝对是UB。
这里的主要问题是,对共享引用背后的值的任何更改都是非法的,UnsafeCell
内部值除外。编译器可以很容易地优化掉第一种情况下的变化,只需替换r
为println
调用。
第二种情况有点棘手,但它基于相同的事实。请注意,表达式&*r
的r
类型Rc<T>
为 ,其类型为 &T (操场):
use std::rc::Rc;
fn test<T>(r: Rc<T>) {
let _: () = &*r; // error: expected (), found &T
}
诀窍在于Rc<T>
derefs to T
,所以*r
有 type T
。
因此,不可变引用再次被视为可变引用。
推荐阅读
- python - 为什么我在安装 pygame 时出现错误
- sql-server - RS.exe 实用程序仍以 .Net 3.5 为目标?
- doctrine - Symfony 4 / Doctrine:实体上的动态表名 => 函数与 find () OK 但 createQueryBuilder () NOK
- reactjs - 为什么 ComponentDidMount 中的异步工作在导航时会导致视觉滞后,除非等待简单的 timeOut?
- python - 指定 csv 中每一列的长度(填充)
- python - 使用 Selenium 在提要中找到 Twitter 帖子
- vuejs2 - 以编程方式更改 vuejs select 中的值
- javascript - [Vue 警告]:无法解析指令:waves(在
在 src/views/backend/areachange/Index.vue) - javascript - 用于构建 JSON 树的简单 JS 图形编辑器
- chart.js - Chart.js:在日志 x 轴上创建自定义主要刻度?