Source:Uninitialized garbage on ia64 can be deadly
源文章继续解释了在推测性加载期间寄存器如何最终具有NaT表示,并作了以下说明:
从其他堆栈陷阱陷阱表示的答案来看,
“任何类型(无符号字符除外)都可以具有陷阱表示形式”。
这个link说
如果分配了这样的寄存器(设置了NaT位的寄存器)来存储未初始化的未签名字符(类似于下面的缺陷报告中的代码片段),那么如何根据ISO C11进行处理?
以下缺陷报告是否指向相同的问题,并且已在ISO C11中进行了纠正?
如果没有,该特殊情况如何处理?
缺陷报告末尾的“为C1X更改”部分中的上述添加是否可以解决这种情况?
defect_report
int foo(void) {
unsigned char uc;
return uc + 1 >= 0;
}
最佳答案
首先,如果您自己还没看过,可以从here(see also)获取C11标准的最终草案。
实际上,DR中的文本已添加到6.3.2.1 p2节中,这使得根据C11未定义的代码被截断了。
标准中有关陷阱表示的部分继续排除unsigned char
可以具有陷阱表示的可能性-但这无关紧要。这里要注意的是,正如DR在2008年 Spring 的注解中所提到的,从标准的角度来看,它实际上根本不需要涉及陷阱表示本身(它们只是UB可能导致金属上的问题)。问题实际上与未初始化的自动值有关。修改后的段落通过澄清unsigned char
不应仅仅因为其特定于类型的属性之一而被视为不受UB通用类型的约束(而不是通过对该属性增加更多的复杂性)来解决此问题。
您可以想象,就像NaT位是IA64上整数的实现细节一样,不存在陷阱表示就是C类型通用家族中一种特定类型的“实现细节”。变量的实际类型仅次于更普遍的规则,即您不应该安全地访问任何未初始化的变量;补充说明了该优先级。