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

朱拉·安塔斯(Juraj Antas)

让我们有这样的代码:

#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。

铛分析也将xy标记为未初始化。第一个函数调用参数是未初始化的值

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

V.博比列夫

我使用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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章