我们知道什么是未定义行为,而且我们(或多或少)知道大多数未定义行为的原因(性能、跨平台兼容性)。假设给定平台,比如 Windows 32 位,我们可以认为未定义行为在该平台上是“众所周知的”并且在整个平台上保持一致吗?我明白“没有一个通用的答案”,那么我将“限制于两个常见的UB”,我经常在生产代码中看到它们(使用多年)。
1) 参考。给出这个
然后使用以下方式访问:
1) 参考。给出这个
union
:union {
int value;
unsigned char bytes[sizeof(int)];
} test;
像这样初始化:
test.value = 0x12345678;
然后使用以下方式访问:
for (int i=0; i < sizeof(test.bytes); ++i)
printf("%d\n", test.bytes[i]);
2) 参考。给定一个无符号 short*
数组,将其转换为(例如)float*
并访问它(参考, 数组成员之间没有填充)。
代码是否依赖于已知的 UBs(如那些)按情况工作(假设编译器可能会改变,并且肯定会改变编译器版本),即使它们是跨平台代码的 UB,它们也依赖于特定于平台的细节(那么如果我们不改变平台,它就不会改变)?同样的推理是否也适用于未指定的行为(当编译器文档没有任何说明时)?
编辑 根据这篇文章,从 C99 开始类型游戏只是未指定的,而不是未定义的。
sizeof(void*) == 4
,但不一定会强制sizeof(int) == 4
。 - barak manos