繁体   English   中英

如何获取/实现类的内置类型成员变量的“未初始化使用警告”消息?

[英]How to get/implement “Uninitialized uses warning” message for built-in type member variable of a class?

#include<iostream>
struct a{   
   int x;
};

int foo() {
    a oa;
    return oa.x;
}

int bar() {
    int a;
    return a;
}

int main() {
    auto val = foo();
    std::cout<<val<<"\n";
    return 0;
}

如果我们编译并运行上面的sample.cpp我们得到以下结果:

$g++ -Wall -std=c++11 sample.cpp -o sample
sample.cpp: In function ‘int bar()’:
sample.cpp:13:9: warning: ‘a’ is used uninitialized in this 
function [-Wuninitialized]
  return a;
         ^
$ ./sample 
-1643562384
$ ./sample 
991591024

对于上面的程序,编译器发出警告有关未初始化的变量的使用abar()函数。 但是,当foo()函数尝试使用struct a类型的对象oa的变量x时,编译器不会发出警告。

我知道c++11 universal initialization功能,如果我们定义如下的struct a ,那么内置的int类型默认构造函数将由struct a默认构造struct a调用。

struct a {
   int x{};
}

我想知道,在上面的情况下,使用type traits/static_assert这样的新功能是否可以实现这样的警告消息?

这样的事情在C#这样的语言中是可能的,因为一切都是从公共类派生的,因此默认构造函数会关注这一点。 Bjarne Stroustrup在他的“ C ++编程语言 ”中提到了这个问题,因为这种并发症的原因是为了提高罕见危急情况下的性能

struct Buf {
int count;
char buf[16∗1024];
};

在将Buf用作输入操作的目标之前,我们可以将Buf用作局部变量而不进行初始化。 但我认为如果我们能够实现某种机制来处理这个问题,那么在很多情况下它会很棒。 这非常有用,因为未初始化的变量使用会导致非确定性错误的主要来源。

这只能在非常简单的情况下实际工作,如此处所示。 在其他情况下,编译器甚至无法在使用前判断成员变量是否已初始化。 例如:

// a.h

void init_a(a & an_a);

// a.cpp

#include "a.h"

void init_a(a & an_a) {
    an_a.x = 1;
}

// b.cpp

#include "a.h"

int test() {
    a oa;
    init_a(oa);
    return oa.x;
}

由于init_a()未在与test()相同的转换单元中定义,因此编译器无法知道在到达return语句时是否分配了x成员。

因此,只有在编译器能够证明成员可能未被初始化的情况下才会触发此类警告,并且在许多情况下编译器无法告知并且无法生成警告。 因此,有这样的警告只能捕获非常简单的情况,并且用处非常有限。

暂无
暂无

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

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