如果没有发生左值到右值转换,则取消引用无效指针是合法的

Pas*_* By 12 c++ language-lawyer

尽我所能,我见过的最接近的答案就是这个,有两个完全相反的答案(!)

问题很简单,这是合法的吗?

auto p = reinterpret_cast<int*>(0xbadface);
*p;  // legal?
Run Code Online (Sandbox Code Playgroud)

我对此事的看法

  1. 将整数转换为指针:对可以转换的内容没有限制
  2. 间接:仅表示结果是左值.
  3. 生命周期:只说明对象无法做到的事情,这里没有任何对象
  4. 表达式语句:*p是一个废弃的值表达式
  5. 丢弃值表达式:不进行左值到右值转换
  6. lvalues的未定义:也就是严格别名规则,只有当左值转换为右值时

所以我得出结论,没有明确说明这是未定义的行为.然而,我清楚地记得一些平台陷入间接无效指针.我的推理出了什么问题?

Rev*_*lot 8

[basic.compound]说:

指针类型的每个值都是以下之一:

  • 指向对象或函数的指针(指针指向对象或函数),或
  • 指针超过对象的末尾([expr.add]),或
  • 该类型的空指针值([conv.ptr]),或
  • 无效的指针值.

通过消除过程,我们可以推断出这p是一个无效的指针值.

[basic.stc]说:

通过无效指针值间接并将无效指针值传递给释放函数具有未定义的行为.无效指针值的任何其他使用都具有实现定义的行为.

由于间接运算符被称为[expr.unary.op]执行间接,我想说,*p无论结果是否被使用,该表达式都会导致UB.