如何解决用于防止使用未初始化的继承属性的 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;
}
你能看到这里的错误吗,它有多棘手?
这里我们构建了一个 B
的实例,以 3
作为参数,我们期望 type
到 A
的值是 3
,对吧?但是我们在 B
构造函数中犯了一个输入错误,我们没有将接收到的参数的内容传递给 A
,而是将值的内容传递给 A::type
。查看 typ
构造函数中 type
与 B
的区别。
那么我怎样才能让 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) :
请注意,可能没有关于变量的警告 仅用于计算本身从未使用过的值, 因为这样的计算可能会被数据流删除 在打印警告之前进行分析。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。