G++ 标志以防止使用未初始化的继承属性
G++ flag to protect against use of uninitialized inherited properties
如何让 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
中的值的内容。在 B
构造函数中查看 typ
与 type
的区别。
那么我怎样才能使 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) :
Note that there may be no warning about a variable that is
used only to compute a value that itself is never used,
because such computations may be deleted by data flow
analysis before the warnings are printed.
如何让 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
中的值的内容。在 B
构造函数中查看 typ
与 type
的区别。
那么我怎样才能使 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) :
Note that there may be no warning about a variable that is used only to compute a value that itself is never used, because such computations may be deleted by data flow analysis before the warnings are printed.