Clang无法在赋值运算符/复制构造函数

时间:2018-04-10 13:04:53

标签: c++ clang lint static-cast

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情况下完成的。

因此它可能是功能请求的输入。你有什么看法?

1 个答案:

答案 0 :(得分:1)

这里违反了别名规则*:

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

由于br实际上并未指向D*,因此您不应该转换为another_d->hello(); 。结果,这是未定义的。

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

another_d

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

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

* [expr.static.cast]:

  

...如果是prvalue   输入“指向 cv1 D的指针”指向一个`B,它实际上是D类型对象的子对象,结果指针   指向<select name="location" id="location"> <?php $locations = getTable("location", $DB); $locationsByState = []; // chunk array by state foreach($locations as $loc) { $locationsByState[$loc['state']][] = $loc; } foreach($locationsByState as $label => $value) { ?> <optgroup label="<?= $label; ?>"> <?php foreach($value as $opt) { echo '<option>' . $opt['region'] .'</option>' } ?> </optgroup> <?php } ?> </select> 类型的封闭对象。否则,行为未定义。