gpt4 book ai didi

c++ - 为什么 g++ -Wreorder 不更聪明?

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

查看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),如果(且仅当)执行任何初始化器时,我想要一个警告,按照它们将被执行的顺序,将引用一个未初始化的值。 IE。以与 -Wuninitialized 相同的方式警告使用未初始化的自动变量。

一些额外的背景:我在一家主要基于 Windows 的公司工作,基本上除了我之外每个人都使用 Visual Studio。 VS 没有此警告,因此没有人关心是否有正确的顺序(并且除了手动检查之外无法知道他们何时搞砸了顺序),因此给我留下了无尽的警告,每次有人破坏某些东西时我都必须不断修复。我只想了解真正有问题的案例,而忽略良性案例。所以我的问题可能更好地表述为:实现这样的警告/错误在技术上是否可行?我的直觉说它是,但它尚未实现的事实让我对此表示怀疑。

最佳答案

我的猜测是,这与我们使用 -Wold-style-cast 的原因相同:过于保守会导致安全错误。只要一不留神,Harmless 就会变成 CarelessMistake。也许这个开发人员很着急,或者有一个旧版本的 GCC,或者看到它“只是一个警告”并继续。

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

如果问题有一个有效的直接答案,我会感到惊讶。我认为没有技术原因无法完成。只是 。 . .为什么要费心去弄清楚有问题的事情是否真的可以呢?编程是人类的工作。


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

关于c++ - 为什么 g++ -Wreorder 不更聪明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28339137/

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