C和C++中未定义,未指定和实现定义的行为有什么区别?
c c++ undefined-behavior unspecified-behavior implementation-defined-behavior
首先,澄清一点,我不是在谈论解除引用无效指针!
考虑以下两个例子.
例1
typedef struct { int *p; } T;
T a = { malloc(sizeof(int) };
free(a.p); // a.p is now indeterminate?
T b = a; // Access through a non-character type?
Run Code Online (Sandbox Code Playgroud)
例2
void foo(int *p) {}
int *p = malloc(sizeof(int));
free(p); // p is now indeterminate?
foo(p); // Access through a non-character type?
Run Code Online (Sandbox Code Playgroud)
题
以上示例中的任何一个都会调用未定义的行为吗?
上下文
提出这个问题是为了回应这一讨论.建议是,例如,指针参数可以通过x86段寄存器传递给函数,这可能导致硬件异常.
根据C99标准,我们学习以下内容(强调我的):
[3.17] 不确定值 - 未指定的值或陷阱表示
然后:
[6.2.4 p2]当指向的对象到达其生命周期的末尾时,指针的值变得不确定.
然后:
[6.2.6.1 p5]某些对象表示不需要表示对象类型的值.如果对象的存储值具有这样的表示并且由不具有字符类型的左值表达式读取,则行为是未定义的.如果这样的表示是由副作用产生的,该副作用通过不具有字符类型的左值表达式修改对象的全部或任何部分,则行为是未定义的.这种表示称为 …