为什么 g++ -Wreorder 不更智能?

Why isn't g++ -Wreorder smarter?

本文关键字:智能 g++ -Wreorder 为什么      更新时间:2023-10-16

看看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没有这个警告,因此没有人关心是否有正确的订单(除了手动检查之外,没有办法知道他们什么时候把订单搞砸了),因此给我留下了无尽的警告,每次有人弄坏东西时,我都必须不断地修复。我只想了解真正有问题的病例,而忽略良性病例。因此,我的问题可能更好地表述为:实现这样的警告/错误在技术上可行吗?我的直觉是这样的,但它还没有实现的事实让我怀疑它。

我的猜测是,这与我们拥有-Wold-style-cast的原因相同:安全性过于保守。把CCD_ 6转换成CCD_。也许这个开发人员很着急,或者有一个旧版本的GCC,或者看到它"只是一个警告",就继续。

在许多警告中,这基本上是正确的。它们通常是伪造的,需要一点重组才能干净地编译,但在某些情况下,它们代表了真正的问题。每个优秀的程序员都会更喜欢处理一些假阳性,如果这意味着他们得到的假阴性更少的话。

如果这个问题有一个有效的直接答案,我会感到惊讶。我认为没有技术上的原因不能做到这一点。只是。为什么要费力地想弄清楚有问题的事情是否真的没事?编程是人类的工作。


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