是否通过C投访问结构的第一场也就侵犯了严格走样?是否通过C投访问结构的第一场也就侵犯了严格走样?(D

2019-05-12 02:25发布

这是否违反代码严格别名?

struct {int x;} a;
*(int*)&a = 3

更抽象,是合法的,只要原始的读/写操作是正确的类型不同类型之间的投?

Answer 1:

首先,它是合法的C.§6.7.2.1/ 13投:

内的结构对象,非位字段构件和单元,其中位字段驻留具有在其声明的顺序增加的地址。 一个指向结构对象,适当地转换,点到它的初始成员(或如果该构件是一个位字段,然后到单元在其中驻留),并且反之亦然。 有可能是一个结构对象中的无名进行填充,而不是在其开始。

混叠规则如下(§6.5/ 7):

对象应具有其存储的值仅由具有以下类型中的一个的左值表达式获得:

  • 一个类型与有效类型的对象的兼容,
  • 的类型的合格版本与所述有效类型的对象的兼容,
  • 一种类型,是有符号或对应于有效类型的对象的无符号类型,
  • 一种类型,是有符号或对应于有效类型的对象的一个​​版本的合格无符号类型,
  • 包括其成员之间的上述类型的一个(包括递归地,一个子聚集的成员或包含联合),或聚集或联合型
  • 字符类型。

在这里,你会通过“类型与有效类型的对象的相容的”,“包括其成员之间的上述类型的一个集合体或联合类型”和,所以没有与任一混叠问题的指针来访问它。 因此,在C,这的确是完全合法的铸造的指针结构有问题的成员的类型来访问结构的第一个成员。

在C ++中,但是,你经常会在C ++对象的开始找到虚函数表和其他东西。 在您的具体情况,但是,你的结构是标准布局的,所以这是明确允许的(第9.2节/ 20 n3290,感谢吕克丹东 - !C ++ 03显然也有类似的规则,表达了POD对象而言) 。



文章来源: Does accessing the first field of a struct via a C cast violate strict aliasing?