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情况下完成的。
因此它可能是功能请求的输入。你有什么看法?
答案 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>
类型的封闭对象。否则,行为未定义。