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

不应访问填充数据

10.10.1 ID_accessPaddingData
目录 › next › previous

内存中各对象之间可能存在填充数据,这种数据只为实现“内存对齐”而无数值意义,而且填充数据的值是标准未声明的。

示例:

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 等函数比较,应实现类型明确的比较接口以供调用,否则很容易产生错误。

相关

ID_ignorePaddingData

依据

ISO/IEC 9899:1999 6.2.6.2(5)-unspecified ISO/IEC 9899:2011 6.2.6.2(5)-unspecified
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.