☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

数据成员之间的填充数据不应被忽视

5.1.18 ID_ignorePaddingData
目录 › next › previous

成员之间存在填充数据,且没有声明对齐方式时,填充数据的长度是由实现定义的,这种数据不应在不同的环境之间传输,而且应注意成员的声明顺序,避免由填充数据造成的空间浪费。

关于填充数据的具体组织方式,详见“内存对齐”。

示例:

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);

相关

ID_accessPaddingData

依据

ISO/IEC 9899:2011 6.2.8(1)-implementation ISO/IEC 14882:2011 3.11(1)-implementation

参考

SEI CERT DCL39-C
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.