尽我所能,我见过的最接近的答案是this https://stackoverflow.com/questions/7346634/dereferencing-an-invalid-pointer-then-taking-the-address-of-the-result/7346775,有两个完全相反的答案(!)
问题很简单,这合法吗?
auto p = reinterpret_cast<int*>(0xbadface);
*p; // legal?
我对此事的看法
-
将整数转换为指针 http://eel.is/c++draft/expr.reinterpret.cast#:cast,integer_to_pointer:对可以投射的内容没有限制
-
间接 http://eel.is/c++draft/expr.unary.op#1:仅说明结果是左值。
-
生命周期 http://eel.is/c++draft/basic.life:仅说明不能对对象执行的操作,这里没有对象
-
表达式语句 http://eel.is/c++draft/stmt.expr:
*p
是一个被丢弃的值表达式
-
废弃的值表达式 http://eel.is/c++draft/expr#12:不发生左值到右值的转换
-
左值的不确定性 http://eel.is/c++draft/basic.lval#8:又名严格别名规则,仅当左值转换为右值时
所以我的结论是没有任何明确的说法这是未定义的行为。但我清楚地记得,某些平台会陷入无效指针的间接陷阱。我的推理出了什么问题?
[碱性化合物] http://eel.is/c++draft/basic.compound#def:invalid_pointer_value says:
指针类型的每个值都是以下之一:
- 指向对象或函数的指针(该指针被称为指向对象或函数),或者
- 超过对象末尾的指针 ([expr.add]),或
- 该类型的空指针值 ([conv.ptr]),或者
- 无效的指针值。
通过排除法我们可以得出p
是无效的指针值。
[基本.stc] http://eel.is/c++draft/basic.stc#1.4 says:
通过无效指针值进行间接寻址并传递一个无效的
指向释放函数的指针值有未定义的行为。任何
无效指针值的其他使用由实现定义
行为。
由于间接运算符据说是通过以下方式执行间接的[expr.unary.op] http://eel.is/c++draft/expr.unary.op#1,我会说,这个表达*p
无论结果是否被使用都会导致UB。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)