C++ 对类中未初始化的变量启用警告
Posted
技术标签:
【中文标题】C++ 对类中未初始化的变量启用警告【英文标题】:C++ enable warning for uninitialized variables in classes 【发布时间】:2019-06-05 08:13:46 【问题描述】:让我们有这个代码:
#include <iostream>
#include <simd/simd.h>
class X
public:
X(int a) : xa // <-- only x is initialized, y is not
int x;
int y;
simd_double3 d;
;
int main(int argc, const char * argv[])
X x(1);
X* xx = new X(2);
std::cout<<x.x<<" "<<x.y<<" "<<x.d.x; // <-- y and x.d are used, but not initialized
std::cout<<xx->x<<" "<<xx->y<<"END\n";
return 0;
我想发出警告,指出 X 中的 y 未初始化。 -Wall, -Wmissing-field-initializers 似乎什么都不做。它编译时没有警告。 此示例代码产生以下输出: 1 0 6.95323e-310 所以即使 y 被初始化为 0(不是,因为 clang 分析将其标记为未初始化),显然 simd_double3 没有初始化为 0。
还有 clang 分析将 x.y 标记为未初始化。 (第一个函数调用参数是一个未初始化的值)
另外,在释放模式下在堆上创建 X 时,x.y 的内容是垃圾。第二行打印:2 -1094795586,y 显然没有初始化。
【问题讨论】:
gcc 发出警告:Demo. GCC 在禁用优化时不显示警告:wandbox.org/permlink/M8uPXGSiflYSCC7J. 添加优化 O1 比测试 O3 ..没有任何帮助。叮当没事。 静态分析发现了它,但我希望在正常编译过程中得到简单的警告。 @Galik 已经讨论过了,例如:GCC - no warning about an uninitialized array with -O0。 【参考方案1】:我使用 clang 8(最新版本)命令行检查所有警告:clang -O2 -Wall -Wextra -Weverything 检查:https://godbolt.org/z/kKp-N5 Clang 对类和结构中的未初始化变量没有任何警告。但是使用 clang-tidy 和 check cppcoreguidelines-pro-type-member-init 可能对你有帮助。https://releases.llvm.org/8.0.0/tools/clang/tools/extra/docs/clang-tidy/checks/cppcoreguidelines-pro-type-member-init.html
【讨论】:
我猜你是对的:正确答案是:clang 没有未初始化变量的警告。这太糟糕了,我被这样多次烧伤,我相信我并不孤单.. clang-tidy 是一种很容易被愚弄并且经常报告误报的检查。 更清楚的是,对于类和结构中的未初始化变量没有警告。它确实会警告您使用本地未初始化的变量。以上是关于C++ 对类中未初始化的变量启用警告的主要内容,如果未能解决你的问题,请参考以下文章