所以我有一些结构包含我想要使用unix套接字发送到另一个进程的数据。此过程可能无法使用相同的编译器版本进行编译,或者甚至可以使用C语言编写。这是结构(注意某些东西被注释掉了):
struct nested_struct {
uint8_t a;
uint8_t b;
uint16_t c;
} */__attribute__((packed))*/;
struct my_struct {
uint32_t num_nested_structs;
/* uint8_t padding[3];*/
uint8_t x;
uint16_t y;
uint16_t z;
struct nested_struct nested[];
} /*__attribute__((packed))*/;
为了方便和表现,我想躲过像
这样的事情 write(socket, &data.x, data.num_nested_structs * sizeof(struct nested_struct) + 5)
或其他什么 - 但我怀疑这是安全的,因为struct my_struct
没有很好地对齐。但是如果我们取消注释打包属性怎么样?这感觉它应该可以工作,但我已经读过按地址引用__packed__
结构中的字段可能很危险。
如果我们取消注释uint8_t padding[3];
字段会怎样?现在两个结构都是字大小对齐的(在具有WORD_BIT = 32
的系统上)。假设编译器在这种情况下不会添加任何填充是否安全?如果是这样,这是否足以确保从5 + 4*num_nested_structs
开始访问&my_struct.x
字节的内存是安全的?