繁体   English   中英

C ++为类中的未初始化变量启用警告

[英]C++ enable warning for uninitialized variables in classes

让我们有这个代码:

#include <iostream>
#include <simd/simd.h>
class X {
public:
    X(int a) : x{a} {} // <-- 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分析标记xy为未初始化。 第一个函数调用参数是未初始化的值

此外,在发布模式下在堆上创建X时,xy的内容是垃圾。 第二行打印:2 -1094795586,y显然未初始化。

我用clang 8(最后发布版本)命令行检查所有警告:

检查: 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM