dhe*_*ein 1 c c99 undefined-behavior c11
想象一下:
int X;
X = X;
Run Code Online (Sandbox Code Playgroud)
这将是未定义的行为
1在以下情况下,行为未定义:
[...]
具有自动存储持续时间的对象的值在不确定时使用(6.2.4,6.7.8,6.8).
但是这个怎么样?
int X;
X;
Run Code Online (Sandbox Code Playgroud)
X;参考引用的invokation是否允许编译器导致未定义的行为?或者这不算X被"使用"?
在C 1999中,使用未初始化的对象并不是直接错误.(附件J中的引用不是标准的标准部分;它们只是提供信息.)具有自动存储持续时间的未初始化对象具有不确定的值.对于某些对象,该值可能是陷阱表示,因此使用它可能会导致未定义的行为.
但是,对于某些对象,可以确定未初始化的对象不能具有陷阱值.例如,a unsigned char不能有陷阱值,并且定义的精确宽度有符号整数类型stdint.h不能有陷阱值(因为它们是没有填充位的二进制补码).对于其他类型,可能是由C实现定义的属性导致它们没有陷阱值.使用未初始化的int X所有C 1999实现中没有定义的行为(但在某些实现中),但使用未初始化的unsigned char X行为.
在C 2011中,这个文本在6.3.2中添加了2:"如果左值指定了一个自动存储持续时间的对象,该对象可以用寄存器存储类声明(从未使用过它的地址),并且该对象未初始化(不是有一个初始化声明,没有分配给它之前,我们使用在C 2011被执行),则该行为是不确定的."因此,双方X = X;并X;具有不确定的行为.
历史/背景:
C 2011更改支持Hewlett-Packard机器,该机器具有用于某些寄存器的特殊标志,用于指示寄存器内容是否有效.如果在内容无效的情况下使用寄存器,则机器可能会生成异常.因此,如果编译器分配X的unsigned char X这样的寄存器时,使用该寄存器时,它是无效的可能会导致在机器中的异常,即使是没有unsigned char陷阱值.