相关疑难解决方法(0)

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

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

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

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

我对此事的看法

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

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

c++ language-lawyer

12
推荐指数
1
解决办法
391
查看次数

C++标准究竟在哪里说取消引用未初始化的指针是未定义的行为?

到目前为止,我无法找到如何推断以下内容:

int* ptr;
*ptr = 0;
Run Code Online (Sandbox Code Playgroud)

是未定义的行为.

首先,有5.3.1/1表示这*意味着转换T*为的间接T.但这对UB没有任何说明.

然后经常引用3.7.3.2/4说在非空指针上使用解除分配函数会使指针无效,之后无效指针的使用是UB.但是在上面的代码中没有关于释放的内容.

如何在上面的代码中推导出UB?

c++ standards undefined-behavior language-lawyer

11
推荐指数
5
解决办法
3494
查看次数