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
的封闭对象。否则,行为是未定义的。