相关疑难解决方法(0)

(为什么)使用未初始化的变量未定义行为?

如果我有:

unsigned int x;
x -= x;
Run Code Online (Sandbox Code Playgroud)

很明显,x 应该这样表达后是零,但到处看,他们说的行为,这种代码是不确定的,而不是仅仅值x(直到减法之前).

两个问题:

  • 这段代码的行为确实未定义吗?
    (例如,代码在兼容系统上崩溃[或更糟]?)

  • 如果是这样,为什么 C表示行为是未定义的,当非常清楚x这里应该为零时?

    即不在此定义行为给出的优势是什么?

很明显,编译器可以简单地使用它在变量中认为"方便"的任何垃圾值,并且它可以按预期工作......这种方法有什么问题?

c initialization undefined-behavior

77
推荐指数
6
解决办法
1万
查看次数

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
查看次数