Clang 无法在赋值运算符/复制构造函数中检测到未初始化的类成员



Clang 不会检查是否所有类成员都已在重载赋值运算符/复制构造函数中初始化,这与 Lint 相反。而不是那个 Clang 检查未初始化变量的使用情况。这种方法应该足够了,但是在静态强制转换的情况下,如以下代码所示:

#include <iostream>
using namespace std; 
struct B 
{
    int member;
    B()
    {
    member =111;
    }
    B(B const & )
    {   
    }
    B& operator=(B const & )
    {
    }
};
struct D : public B 
{
    void hello() const 
    {   
    cout << "member value " << member << "n";
    }
    D()    
    {
    }
};
int main()
{
    D d;
    D d2  = d;
    B* br ;
    D* another_d = static_cast<D*>(br); 
    another_d->hello();
}

静态强制转换只是逐字节地应对,它不能保证所有成员都被初始化,但它是不安全代码的间隙,可以通过检查复制主体的主体来避免,因为它是在 lint 情况下完成的。

因此,它可以是功能请求的输入。你有什么意见?

这里违反了别名规则*:

B* br;
D* another_d = static_cast<D*>(br); 

由于br实际上并没有指向一个D*,所以你不应该投射到一个。因此,这是未定义的beavior。

然后这是更多未定义的行为:

another_d->hello();

尝试取消引用指针another_d(即使作为B*(是未定义的,因为B* br仍未初始化。

当我们在UB土地上时,任何事情都会发生。


*[expr.static.cast]:

。如果 prvalue 的 类型"指向 cv1 B 的指针"指向一个 ''B,它实际上是类型 D 对象的子对象,生成的指针 指向类型 D 的封闭对象。否则,行为是未定义的。

最新更新