轻松找到未初始化的成员变量

use*_*669 46 c++ findbugs initialization

我正在寻找一种简单的方法来查找未初始化的类成员变量.

运行时编译时查找它们都可以.

目前我在类构造函数中有一个断点,并逐个检查成员变量.

Gru*_*bel 29

如果使用GCC,则可以使用-Weffc++标志,该标志在成员初始化列表中未初始化变量时生成警告.这个:

class Foo
{
  int v;
  Foo() {}
};
Run Code Online (Sandbox Code Playgroud)

导致:

$ g++ -c -Weffc++ foo.cpp -o foo.o
foo.cpp: In constructor ‘Foo::Foo()’:
foo.cpp:4: warning: ‘Foo::v’ should be initialized in the member initialization list
Run Code Online (Sandbox Code Playgroud)

一个缺点是-Weffc++当变量具有适当的默认构造函数时也会警告您,因此不需要初始化.它还会在构造函数中初始化变量时向您发出警告,但不会在成员初始化列表中发出警告.它警告许多其他C++样式问题,例如缺少复制构造函数,因此当您想要-Weffc++定期使用时,可能需要稍微清理一下代码.

还有一个错误导致它在使用匿名联合时总是给你一个警告,你现在无法解决其他问题然后关闭警告,这可以通过以下方式完成:

#pragma GCC diagnostic ignored "-Weffc++"
Run Code Online (Sandbox Code Playgroud)

总的来说,我发现-Weffc++在捕获大量常见的C++错误方面非常有用.


Zit*_*rax 10

如果你在Linux上,Valgrind可以告诉你.

  • `uname -a` 也会告诉我我是否在 Linux 上......但它对此没有帮助;-) (6认同)

Wil*_*ill 10

Valgrind(免费,在Linux上)和Purify(在Windows上)通过在特殊虚拟机中运行代码来查找未初始化的变量,无效指针等.

这很容易使用,非常强大; 除了显而易见的未初始化变量之外,它可能会发现许多错误.

Coverity,KlocworkLint可以使用静态代码分析找到未初始化的变量.


Joh*_*ski 10

cppcheck会找到这个,例如:

cppcheck my_src_dir --output-file=check.txt --inconclusive --enable=warning
Run Code Online (Sandbox Code Playgroud)


ken*_*ytm 6

-Wuninitialized

(这仅检查变量是否未初始化,即是否

struct Q { 
  int x, y;
  Q() : x(2) {}
  int get_xy() const { return x*y; }
};
Run Code Online (Sandbox Code Playgroud)

只有当用户在get_xy()没有分配的情况下调用时,g ++才会发出警告y.)

  • 还需要-O1或以上,这不是默认值. (2认同)

小智 5

Visual Studio(MSVC)具有/ sdl(启用其他安全检查)编译器选项(http://msdn.microsoft.com/en-us/library/jj161081.aspx).在运行时,它:

执行类成员初始化.在对象实例化时(在构造函数运行之前)自动将指针类型的类成员初始化为零.这有助于防止使用与构造函数未显式初始化的类成员关联的未初始化数据.

这不会帮助您在编译时检测未初始化的成员变量,但是当它在运行时发生时,它会使行为更具可预测性.当然,您不应该编写依赖于此选项的代码.