为什么 g++ 对未初始化变量的警告取决于变量的类型?(它对 int 发出警告,但不对 double 发出警告)

12

我目前正试图了解在哪些情况下g++会警告未初始化的变量。考虑以下代码片段:

#include <iostream>

typedef double barType;

struct foo {

    barType bar;

};

int main() {

    foo f;

    std::cout << f.bar << std::endl;

}

如果我以这种方式编译,就不会收到任何警告:

$ g++ -O1 -Wall test.cc -o test

但如果我将barType更改为int:

$ g++ -O1 -Wall test.cc -o test
  test.cc: In function ‘int main()’:
  test.cc:17: warning: ‘f.foo::bar’ is used uninitialized in this function

这个警告如何与类型有关?在两种情况下都未初始化。

我正在使用:

$ g++ --version
g++ (Ubuntu 4.4.1-4ubuntu9) 4.4.1
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

谢谢,

某人

4个回答

11

这是未定义行为,不需要进行诊断,因此编译器可以自由判断。他们本可以做得更好。


1

如果您使用 -O 进行编译,可以通过此选项进行警告。我不是很清楚为什么,但如果必须猜测,那就是为了编译速度的目的,即它已经需要为优化找出这个问题,因此只有在您想要进行优化时才会报告。

还有一个 -Wuninitialized 选项,实际上并未包含在“all”中,但也需要 -O。至少如果您使用 -Wuninitialized,编译器会警告您无法警告...

cc1plus: warning: -Wuninitialized is not supported without -O

这个问题的一个好的收获是,-Wall 命名不太合适。还有其他的 -W 选项没有包含在“all”中。请查阅文档以获取更多信息。

1

猜测他们可能更关心使用未初始化的整数类型,而不是浮点数或双精度浮点数,因为您可以使用整数类型与指针偏移量一起使用而无需转换,这可能非常危险(tm)


1
未初始化的浮点数和整数一样糟糕。如果这是一个经过深思熟虑的决定,那么这是一个愚蠢的决定。当然,也可能有其他解释。 - David Heffernan
在这里支持David的评论,即使最糟糕的情况只是将一系列随机位用作双精度浮点数,那么这些位有时可能代表无穷大或NaN,从而产生各种有趣的、每50000次执行才发生一次的后果。 - Pascal Cuoq

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接