为什么gcc不对代码中的未定义行为给出警告

Why does gcc not give a warning at undefined behaviour in code inside?

本文关键字:警告 未定义 gcc 代码 为什么      更新时间:2023-10-16

我刚刚读了这篇关于未定义行为和序列点的c++常见问题解答,并做了一些实验。在下面的代码中,gcc-4.5.2只在代码注释中提到的行中给我一个警告,虽然之前的一行也显示未定义的行为,不是吗?您不能说哪个加法操作数首先执行(因为+不是序列点)。为什么gcc没有在这一行也给我一个警告?

int i=0;
int j=0;
int foo(void) {
    i=1;
    return i;
}
int main(void) {
    i = i + foo(); 
    j = j + (j=1); //Here is a rightly warning
    return 0;
}

谢谢你的帮助

i = i + foo()的行为;未指定但并非未定义。未定义意味着允许任何可能的行为,甚至中止程序。未指定意味着首先计算i或foo()。是的,foo写入相同的i,但由于它发生在单独的语句中,因此在该存储之前和之后都有一个序列点。

程序中的i = i + foo();行未指定,但不是未定义。

编译器试图发出没有误报的警告(每次编译器发出警告,都有一个程序员应该修复的缺陷),或者至少具有非常低的误报率。这意味着,作为交换,他们有相当多的假阴性。按照同样的原则,编译器通常不会对未指定的行为发出警告。

要获得有关程序的警告,您应该查看静态分析程序,静态分析程序对警告更积极,但代价是出现更多的误报。静态分析器可以很好地决定对未指定的行为发出警告。他们中的一些甚至对定义的行为发出警告,尽管这些行为已经定义,但表明程序员可能感到困惑。

对于人类来说调用foo()会改变它是可见的,但是对于计算机程序来说很难看到。它的设计不是为了看到这个。

相关文章: