结构的陷阱表示

时间:2018-12-23 08:27:13

标签: c struct language-lawyer

我想详细了解陷阱表示的概念。定义非常清楚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的表示形式是一个陷阱。

1 个答案:

答案 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,但这不是由陷阱表示的可能性引起的。完全没有定义。