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)
时捕获它。这也意味着,如果构造函数位于其自己的编译单元中,编译器不会识别它(我想这在现实世界中应该经常出现)。
当你在函数中执行此操作时:
int i = i;
然后我想,你可以在GCC中使用
-Wuninitialized
选项,因为它是使用未初始化的变量i
来初始化i
。 与代码中的成员变量相同。
另请注意,此代码会调用未定义的行为。但是,如果您在命名空间级别对变量执行此操作,那么这是明确定义的。
在 msvc 或 gcc 下似乎没有任何编译器标志。然而,对于 gcc,valgrind 会发现任何未初始化变量的使用,从而解决了问题。不确定 Windows 的解决方案。 Visual Studio 代码分析看起来可能会识别它,但这在基本版本中不可用。