为什么 -Wunused-value 没有捕获语句 `true;`?

问题描述 投票:0回答:1

给出以下 C 代码:

#include <stdbool.h>

int main (void)
{
    true;
    return 0;
}

我预计

-Wunused-value
会在第 5 行引起警告:
    true;

因为这个语句没有任何作用,并且可能是错误的根源
但它会悄无声息 - 事实上
-Wunused -Wall -Wextra
并没有抓住它。


为了比较,像这样:

#define TRUE 1

int main (void)
{
    TRUE;
    return 0;
}

或者这个:

int main (void)
{
    1;
    return 0;
}

将触发正确的警告(GCC 14.2):

<source>: In function 'main':
<source>:3:5: warning: statement with no effect [-Wunused-value]
    3 |     1;
      |     ^

所以我开始挖掘;我认为这可能是 GCC 的回归。
我从 GCC 14.2 降到了非常非常旧的版本
似乎 GCC 3.4.6 是最后一个按预期出现警告的版本。

我想过向 GCC 报告此事,但后来我检查了 Clang
自 Clang 3.0.0 起,Clang 也不会产生任何关于此的警告

参见:https://godbolt.org/z/T361d3ad6


虽然我能够在 GCC 邮件列表上找到类似的错误,例如
https://gcc.gnu.org/pipermail/gcc-bugs/2021-November/765405.html
我无法相信两个主要的编译器供应商在很长一段时间内都存在相同的错误。

我怀疑这种情况正在发生,因为

true
是在libc头文件中定义的宏
并且编译器通常不会对来自 libc 的问题大喊大叫
但由于这件事发生在我的代码中,我有点担心。
我浪费了很多时间来找到这个,然后意识到警告应该捕获它。


发生这种情况有什么理由吗?
或者这只是编译器中应该报告的错误/回归?

c gcc clang compiler-warnings libc
1个回答
0
投票

警告不会显示,因为宏

true
是在系统标头中定义的,并且系统标头中的警告通常会被抑制。

如果添加

-Wsystem-headers
标志,您会看到警告。

© www.soinside.com 2019 - 2024. All rights reserved.