用于防止使用未初始化的继承属性的 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 作为参数,我们期望 typeA 的值是 3,对吧?但是我们在 B 构造函数中犯了一个输入错误,我们没有将接收到的参数的内容传递给 A,而是将值的内容传递给 A::type。查看 typ 构造函数中 typeB 的区别。

那么我怎样才能让 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) :

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...