避免转换指向数组的指针
12.14 ID_arrayPointerCast
指针的逻辑大小与类型相关,转换指向数组的指针极易造成元素定位、空间计算等方面的错误。
示例:
struct A { int x; };
struct B: A { int y; };
void foo(A* p, int n) {
for (int i = 0; i < n; i++) {
p[i].x = 1;
}
}
void bar() {
B arr[100];
foo(arr, 100); // Non-compliant
....
}
例中派生类对象的数组被转换成了基类指针,foo 函数中对数组元素的定位将是错误的。
另外,在回收动态分配的数组时,如果指针的类型与实际元素的类型不一致,会导致标准未定义的行为:
A* p = new B[100]; // Non-compliant
delete[] p; // Undefined behavior
这是一个危险的问题,本规则针对所有数组相关的隐式和显式类型转换。
依据
ISO/IEC 14882:2003 5.3.5(3)-undefined
ISO/IEC 14882:2011 5.3.5(3)-undefined