gpt4 book ai didi

c++ - 什么是 gcc Wmaybe-未初始化警告

转载 作者:行者123 更新时间:2023-12-05 08:27:39 49 4
gpt4 key购买 nike

我知道 gcc 中有一个未初始化的警告,可以告诉您变量是否未初始化。这对我来说很清楚。但我想知道什么是“Maybe-Initialized”警告?

gcc 不确定这是否已初始化。或者考虑一下,代码正确初始化并且 gcc 认为“可能”它没有初始化。如果编译器不确定为什么我应该有这个警告?

现在我可以使用 -Wno-maybe-uninitialized 禁用警告或在代码中进行修复。

但我的问题是这意味着什么?为什么 gcc 认为它可能未初始化。 gcc 确定变量已初始化,因为我没有得到 -Wuninitialized

我使用的是 GCC 4.8 Fedora 21 x86_64。

另外,如果有人可以展示如何触发此警告,我将不胜感激。

最佳答案

有些情况下编译器可以清楚地检测到某些东西没有被初始化:

void func1(int x);  

void func()
{
int x;
func1(x); // x is definitely not initialized when calling func1;
}

但在某些情况下,变量CAN已经被初始化:

void func(int y)
{
int x;
if (y == 1)
x = 7;
else if (y == 2)
x = 14;
// If we get here, is x initialized or not?
func1(x);
}

现在,如果你我都确定 yALWAYS onw 或 two,那么上面的代码就没有问题。但是,如果我们用y作为三个来调用它,x还没有初始化,func1将对一个未指定的值进行操作。如果启用 -Wmaybe-uninitialized,编译器将针对这种情况发出警告。

解决方法是告诉编译器不要期望任何其他值,例如使用 assert:

void func(int y)
{
int x;
assert( y == 1 || y == 2 && "Can't deal with y not in { 1, 2 } ");
if (y == 1)
x = 7;
else if (y == 2)
x = 14;
// If we get here, is x initialized or not?
func1(x);
}

现在,编译器将知道 assert 的结果不允许 y 为 1 或 2 以外的任何值,因此所有有效值都被覆盖.不返回的 assert 会捕获无效值。

[当然,标准中并没有说明assert有这个作用。这是调用流分析结合数据流分析和理解 assert 的作用的结果——我知道 gcc 和 clang 都理解这种结构,并且会很乐意在没有警告的情况下接受上面的代码]

关于c++ - 什么是 gcc Wmaybe-未初始化警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33982195/

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