禁用柔性数组
6.4.3 ID_forbidFlexibleArray
柔性数组(flexible array)指结构体最后不完整定义的数组成员,表示不占用空间的指针,这种数组由 C99 标准提出,不在 C++ 标准之内,在 C++ 代码中不应使用。
示例:
struct A {
int len;
int dat[]; // Non-compliant, flexible array
};
A* cpy(const A* p) {
A* a = (A*)malloc(
sizeof(A) + p->len * sizeof(int)
);
*a = *p; // Data loss, only p->len is copied
return a;
}
例中 *a = *p 这种拷贝赋值运算会漏掉数组的内容,而且数组不会计入 sizeof 的结果,易引起意料之外的错误,所以在 C 代码中也不建议使用柔性数组。
依据
ISO/IEC 9899:1999 6.7.2.1(16)
ISO/IEC 9899:2011 6.7.2.1(18)
参考
MISRA C 2012 18.7