启用编译器警告以自身初始化成员变量

问题描述 投票:0回答:2

gcc 和/或 vs 下是否有编译器警告来检测向自身发起的成员变量?

gcc 有 -Winit-self,但似乎只适用于

int f()
{
    int i = i;
    return i;
}

而不是为了

class A {
    int m; 
public:
    A(int) : m(m) { } 
    int f() {return m;} 
};

编辑:收回问题,所缺少的只是 -O1 或以上(谢谢@honk)

编辑2:实际上,问题又回到了桌面上。在一个简单的示例中, -O1 -Wuninitialized -Winit-self 可以工作,但是,它不是在您声明

m(m)
时捕获它,而是在您定义
A(4)
时捕获它。这也意味着,如果构造函数位于其自己的编译单元中,编译器不会识别它(我想这在现实世界中应该经常出现)。

c++ warnings
2个回答
0
投票

当你在函数中执行此操作时:

int i = i;

然后我想,你可以在GCC中使用

-Wuninitialized
选项,因为它是使用未初始化的变量
i
来初始化
i
。 与代码中的成员变量相同。

另请注意,此代码会调用未定义的行为。但是,如果您在命名空间级别对变量执行此操作,那么这是明确定义的。


0
投票

在 msvc 或 gcc 下似乎没有任何编译器标志。然而,对于 gcc,valgrind 会发现任何未初始化变量的使用,从而解决了问题。不确定 Windows 的解决方案。 Visual Studio 代码分析看起来可能会识别它,但这在基本版本中不可用。

© www.soinside.com 2019 - 2024. All rights reserved.