不应访问填充数据
10.10.1 ID_accessPaddingData
内存中各对象之间可能存在填充数据,这种数据只为实现“内存对齐”而无数值意义,而且填充数据的值是标准未声明的。
示例:
struct A {
char a;
long b;
};
void foo(A* x, A* y) {
if (memcmp(x, y, sizeof(*x)) == 0) { // Non-compliant
....
}
}
如果按常见的 4 或 8 字节对齐,A 的成员 a 和 b 之间会存在填充数据,填充数据参与比较将得到错误的结果。
应改为:
void foo(A* x, A* y) {
if (x->a == y->a && x->b == y->b) { // Compliant
....
}
}
即使成员之间没有填充数据也不应使用 memcmp 等函数比较,应实现类型明确的比较接口以供调用,否则很容易产生错误。
相关
依据
ISO/IEC 9899:1999 6.2.6.2(5)-unspecified
ISO/IEC 9899:2011 6.2.6.2(5)-unspecified