G++标志以防止使用未初始化的继承属性



我如何制作g++来保护我不被使用未初始化的父属性到子构造函数中?

struct A {
A(int typ): type{typ} {}
const int type;
};
struct B : public A {
B(int typ): A(type) {}
};
int main() {
B b{3};
return 0;
}

你能看到这里的bug吗,它有多棘手?在这里,我们用3作为参数来构建B的实例,我们期望typeA的值是3,对吧?但是,我们在B构造函数中输入了一个错误,并且我们没有将接收到的参数的内容传递给A,而是将值的内容已经传递给了A::type。请参阅B构造函数中typtype的差异。

那么,我该如何制作g++来温暖我呢?因为这是不允许的,A还没有初始化,所以我们不应该访问A属性。

要使用的标志是-Wuninitialized,它已经嵌入了-Wextra-Wall

但在我的例子中,我在c++14模式中使用gcc-6.4。在这个gcc版本中,您必须使用标志、启用优化并使用已用未初始化变量初始化的变量。只有当所有这些条件都已完成时,gcc才会警告您使用了未初始化的变量。

您可以在此处看到:https://compiler-explorer.com/z/q53sYr-如果我删除-O2标志或b.type上的最后一个条件,gcc将不会警告我们。

正如手册页所说(https://man7.org/linux/man-pages/man1/g++.1.html):

请注意,对于仅用于计算其本身从未使用过的值,因为这样的计算可能会被数据流删除在打印警告之前进行分析。

最新更新