为什么没有g ++ -Wreorder更聪明?

时间:2015-02-05 08:15:05

标签: c++ gcc gcc-warning

查看What's the point of g++ -Wreorder,我完全理解-Wreorder对您有用的内容。但是编译器能够检测到这种重新排序是否无害是不合理的:

struct Harmless {
  C() : b(1), a(2) {}
  int a;
  int b;
};

或破碎:

struct Broken {
  C() : b(1), a(b + 1) {}
  int a;
  int b;
};

我的问题是:为什么GCC没有检测(并警告)初始化程序中未定义成员的实际使用,而不是对初始化程序的排序进行全面警告?

据我了解,-Wuninitialized仅适用于自动变量,实际上它并未检测到上述错误。


编辑:

正式确定我想要的行为: 给定初始化列表: a1(expr1), a2(expr2), a3(expr3) ... an(exprn),如果(并且仅当)执行任何初始化程序(按它们将被执行的顺序)将引用未初始化的值,我想要一个警告。即与-Wuninitialized一样,警告使用未初始化的自动变量。

一些额外的背景:我在一家大多数基于Windows的公司工作,基本上每个人都使用Visual Studio。 VS没有这个警告,因此没有人关心正确的订单(并且无法知道他们何时搞砸订单除了人工检查),因此给我留下了无休止的警告,每次有人破坏时我都必须不断修复。我想知道只有真正有问题的案例,而忽略了良性案例。所以我的问题可能更好地表达为:在技术上是否可行实施这样的警告/错误?我的直觉就是这样,但事实上它还没有实施,这让我有点怀疑。

1 个答案:

答案 0 :(得分:4)

我的猜测是,出于同样的原因,我们-Wold-style-cast:过于保守,安全犯错。所需要的是将Harmless转换为CarelessMistake的时刻。也许这个开发人员匆忙或者有一个旧版本的GCC,或者看到它只是“警告”并继续按下。

在许多警告中基本上都是这样。它们通常是虚假的,需要进行一些重组才能干净地编译,但在某些情况下它们代表了真正的问题。如果这意味着他们会减少假阴性,那么每个优秀的程序员都会更喜欢一些误报。

如果这个问题有一个有效的直接答案,我会感到惊讶。我没有看到技术上的原因无法完成。只是 。 。 。为什么还要弄清楚是否有问题确实可行?编程是人类的工作。


作为个人原因,我认为按照您声明的顺序初始化变量通常是有意义的。