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

Posted

技术标签:

【中文标题】G++ 标志以防止使用未初始化的继承属性【英文标题】:G++ flag to protect against use of uninitialized inherited properties 【发布时间】:2021-02-18 15:26:34 【问题描述】:

我怎样才能让 g++ 保护我不使用未初始化的父属性到子构造函数中?

struct A 
    A(int typ): typetyp 
    const int type;
;

struct B : public A 
    B(int typ): A(type) 
;

int main() 
    B b3;
    return 0;

你能看到这里的错误吗,它有多棘手? 这里我们构建了一个B 的实例,以3 作为参数,我们期望type 的值为A3,对吧?但是我们在B构造函数中输入错误,我们没有将接收到的参数的内容传递给A,而是将值的内容传递给A::type。在B 构造函数中查看typtype 的区别。

那么我怎样才能让 g++ 温暖我呢?因为它不应该被允许,A 尚未初始化,我们不应该能够访问 A 属性。

【问题讨论】:

不是警告,但是如果你给构造函数参数与成员同名,那么构造函数参数将被使用,因为它隐藏了父类成员。 -Wuninitialized: compiler-explorer.com/z/5rMPah @NathanOliver 确实如此,但这就是我说输入错误的原因 我明白了,但是如果它们的名称相同,那么打字错误就会变成编译器错误(名称不存在),而不是静默编译。 @dyp 它似乎不起作用,标志对我没有任何作用,你知道原因吗? 【参考方案1】:

要使用的标志是-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):

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

【讨论】:

嗯,关于未使用参数的警告也是一个很好的提示……

以上是关于G++ 标志以防止使用未初始化的继承属性的主要内容,如果未能解决你的问题,请参考以下文章

使用 memset 防止“可变大小的对象可能未初始化”

swift 属性未在 super.init 调用中初始化

Python菱形继承的初始化问题和继承顺序

在初始加载时快速重置核心数据属性标志?

如果 com dll 未注册,如何防止崩溃

如何防止 SwiftUI 像使用 @StateObject 一样重新初始化我的包装属性?