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

避免转换指向数组的指针

12.14 ID_arrayPointerCast
目录 › next › previous

指针的逻辑大小与类型相关,转换指向数组的指针极易造成元素定位、空间计算等方面的错误。

示例:

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

参考

C++ Core Guidelines C.152
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.