微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决用于防止使用未初始化的继承属性的 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) :

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。