bugprone-pointer-arithmetic-on-polymorphic-object

查找对包含虚函数的类执行的指针运算。

在多态对象上执行指针运算,其中指针的静态类型与其动态类型不同,会导致未定义的行为,因为这两种类型的大小可能不同,因此 vtable 指针可能指向无效地址。

查找静态类型包含虚成员函数的指针是一个很好的启发式方法,因为该指针可能指向不同的派生对象。

示例

struct Base {
  virtual ~Base();
  int i;
};

struct Derived : public Base {};

void foo(Base* b) {
  b += 1;
  // warning: pointer arithmetic on class that declares a virtual function can
  // result in undefined behavior if the dynamic type differs from the
  // pointer type
}

int bar(const Derived d[]) {
  return d[1].i; // warning due to pointer arithmetic on polymorphic object
}

// Making Derived final suppresses the warning
struct FinalDerived final : public Base {};

int baz(const FinalDerived d[]) {
  return d[1].i; // no warning as FinalDerived is final
}

选项

IgnoreInheritedVirtualFunctions

当为 true 时,不会检查仅继承虚函数的对象。默认情况下,不声明新虚函数的类会被排除在外,因为它们构成了大多数误报。默认值:false

void bar(Base b[], Derived d[]) {
  b += 1; // warning, as Base declares a virtual destructor
  d += 1; // warning only if IgnoreVirtualDeclarationsOnly is set to false
}

参考文献

此检查对应于 SEI Cert 规则 CTR56-CPP. 不要在多态对象上使用指针运算