数据成员之间的填充数据不应被忽视
5.1.18 ID_ignorePaddingData
成员之间存在填充数据,且没有声明对齐方式时,填充数据的长度是由实现定义的,这种数据不应在不同的环境之间传输,而且应注意成员的声明顺序,避免由填充数据造成的空间浪费。
关于填充数据的具体组织方式,详见“内存对齐”。
示例:
struct T {
int8_t a;
int32_t b;
} obj;
recv(sockfd, &obj, sizeof obj, flags); // Non-compliant
例中成员 a 和 b 之间存在填充数据,但没有声明对齐方式,直接在网络上传输这种类型的对象是不符合要求的,如果发送端的对齐方式与接收端不一致就会造成混乱。
应在发送端和接收端统一声明对齐方式:
#pragma pack(push, 1)
struct T {
int8_t a;
int32_t b;
};
#pragma pack(pop)
注意,敏感数据可能会残留在填充数据中,所以当存储或传输对象前有必要清理填充数据的值,如:
struct T obj;
memset(&obj, 0, sizeof(obj)); // Required
....
fwrite(&obj, sizeof(obj), 1, fp);
相关
依据
ISO/IEC 9899:2011 6.2.8(1)-implementation
ISO/IEC 14882:2011 3.11(1)-implementation