我想详细了解陷阱表示的概念。定义非常清楚Section 3.19.4
:
对象表示形式,不必表示对象的值 输入
好的,我想通过一些例子来尝试一下。
struct test_t{
uint64_t member;
};
struct test_t *test_ptr = malloc(sizeof(uint32_t));
struct test_t = *test_ptr; //1
我认为//1
不会在这里导致UB,因为Section 6.2.6.1
:
如果对象的存储值具有这种表示形式并且可以读取 通过没有字符类型的左值表达式, 行为是不确定的。
但是
结构或联合对象的值永远不会是陷阱 表示形式,即使结构或 联合对象可能是陷阱表示。
我认为UB将由
之类的原因引起printf("Test.member = %lu\n", test.member);
但是我不确定如何证明在这种情况下member
的表示形式是一个陷阱。
答案 0 :(得分:3)
let x=response.result.value as! NSDictionary
没有陷阱表示,因为member
没有陷阱表示。
7.20.1.1精确宽度整数类型
2 typedef名称uint N _t指定无符号整数类型 宽度为 N 且没有填充位。因此,uint24_t表示这样的 宽度恰好为24位的无符号整数类型。
无填充位。然后从以下部分中学习:
6.2.6.2整数类型
1对于除无符号字符以外的无符号整数类型,这些位 对象表示形式应分为两组:值 位和填充位(不需要任何后者)。如果有 是N个值位,每个位应代表2的不同幂 在1和2 N-1 之间,因此该类型的对象应为 能够使用0表示从0到2 N -1的值 纯二进制表示;这就是所谓的价值 表示。任何填充位的值是 未指定。 53)
注释53尽管不是规范性的,但告诉我们这些填充位(如果存在)可用于捕获:
53)填充位的某些组合可能会产生陷阱 表示,例如,如果一个填充位是奇偶校验位。 无论如何,对有效值进行的算术运算都不会产生 陷阱表示,但不是例外情况的一部分 例如溢出,而对于无符号类型则不会发生。所有 填充位的其他组合是替代对象 由值位指定的值的表示形式。
虽然值位永远不能保存非法的模式。
因此,您不能在格式正确的程序中生成uint64_t
的陷阱表示。请注意,由于越界访问,您的程序具有UB,但这不是由陷阱表示的可能性引起的。完全没有定义。