【问题标题】:GCC ignores diagnostic pragmas while Clang doesn'tGCC 会忽略诊断编译指示,而 Clang 不会
【发布时间】:2021-04-19 20:21:21
【问题描述】:

GCC 10.2.0 和 Clang 11.1.0。

我有以下代码:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
                uint8_t hour = p[8];
                uint8_t min = p[9];
                uint8_t sec = p[10];
                uint16_t msec = (p[11] * 4);
#pragma GCC diagnostic pop

Clang(由 YouCompleteMe (YCM) Vim 插件使用)支持这些编译指示,并且在文件处理期间不显示任何警告。我可以通过注释掉这些 pragma 来确认 - YCM 诊断程序会立即在相应的行上向我显示警告。

但是,GCC 会忽略它们,我在控制台日志中得到以下信息:

packet.c:111:26: warning: unused variable ‘msec’ [-Wunused-variable]
  111 |                 uint16_t msec = (p[11] * 4);
      |                          ^~~~
packet.c:110:25: warning: unused variable ‘sec’ [-Wunused-variable]
  110 |                 uint8_t sec = p[10];
      |                         ^~~
packet.c:109:25: warning: unused variable ‘min’ [-Wunused-variable]
  109 |                 uint8_t min = p[9];
      |                         ^~~
packet.c:108:25: warning: unused variable ‘hour’ [-Wunused-variable]
  108 |                 uint8_t hour = p[8];
      |                         ^~~~

用于构建的标志:

CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fno-plt -Wall -pedantic -Werror=format-security" CXXFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fno-plt -Wall -pedantic -Werror=format-security" LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now"

这里发生了什么?这似乎是 GCC 中的一个错误。

即使对于这个最简单的程序,情况似乎也是如此:

int main(int argc, char *argv[]) {
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
    int x;
#pragma GCC diagnostic pop

    return 0;
}

测试:

cd /tmp
clang -Wall main.c
gcc -Wall main.c

main.c: In function ‘main’:
main.c:4:9: warning: unused variable ‘x’ [-Wunused-variable]
    4 |     int x;
      |         ^

Some similar bug被描述为g++,至今仍开放了大约九年!

【问题讨论】:

    标签: gcc clang youcompleteme


    【解决方案1】:

    似乎与范围有关。当我将 push/pop #pragmas 移到变量块之外时,GCC 表现良好。例如:

    #pragma GCC diagnostic push
    #pragma GCC diagnostic ignored "-Wunused-variable"
                    uint8_t hour = p[8];
                    uint8_t min = p[9];
                    uint8_t sec = p[10];
                    uint16_t msec = (p[11] * 4);
    #pragma GCC diagnostic pop
    

    应该改为:

    #pragma GCC diagnostic push
    #pragma GCC diagnostic ignored "-Wunused-variable"
                {
                    uint8_t hour = p[8];
                    uint8_t min = p[9];
                    uint8_t sec = p[10];
                    uint16_t msec = (p[11] * 4);
                }
    #pragma GCC diagnostic pop
    

    然后 Clang 和 GCC 都可以正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-02
      • 1970-01-01
      • 1970-01-01
      • 2019-01-17
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      相关资源
      最近更新 更多