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. 不要在多态对象上使用指针运算。