gpt4 book ai didi

c++ - 如何为类的内置类型成员变量获取/实现 "Uninitialized uses warning"消息?

转载 作者:太空狗 更新时间:2023-10-29 20:39:49 33 4
gpt4 key购买 nike

#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

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

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

struct a {
int x{};
}

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

这样的事情在像 C# 这样的语言中是可能的,因为一切都是从公共(public)类派生的,因此默认构造函数会关心这一点。 Bjarne Stroustrup 在他的“The C++ Programming Language”中提到了这种复杂化的原因是为了在罕见的关键情况下提高性能

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

我们可以将 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() 相同的翻译单元中,编译器无法知道 x 成员是否是在到达 return 语句时分配。

所以这样的警告只能在编译器能够证明成员可能没有被初始化的情况下触发,而在很多情况下编译器无法判断也无法产生警告。因此,有这样的警告只能捕捉到极其简单的情况,作用非常有限。

关于c++ - 如何为类的内置类型成员变量获取/实现 "Uninitialized uses warning"消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26447554/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com