【问题标题】:Coverity Scan fails to build <stdlib.h> with _GNU_SOURCE definedCoverity Scan 无法使用定义的 _GNU_SOURCE 构建 <stdlib.h>
【发布时间】:2018-10-30 05:56:51
【问题描述】:

在定义 _GNU_SOURCE 时,Coverity Scan Build Tool 无法在 Ubuntu 18.04 上编译任何包含 &lt;stdlib.h&gt; 的 C 文件:

$ cat > main.c
#include <stdlib.h>
int main() {
}
$ 
$ gcc -D_GNU_SOURCE=1 -o main main.c 
$ 
$ /opt/cov-analysis/bin/cov-build --dir cov-int gcc -D_GNU_SOURCE=1 -o main main.c 
Coverity Build Capture (64-bit) version 2017.07 on Linux 4.15.0-20-generic x86_64
...
[WARNING] Emitted 0 C/C++ compilation units (0%) successfully
...
$ 

相同的构建版本在 Ubuntu 16.04 或未定义 _GNU_SOURCE 时完美运行:

$ /volatile/local/cov-analysis/bin/cov-build --dir cov-int gcc -o main main.c 
Coverity Build Capture (64-bit) version 2017.07 on Linux 4.15.0-20-generic x86_64
...
Emitted 1 C/C++ compilation units (100%) successfully
...
$ 

如何让 Coverity Scan 在 Ubuntu 18.04 上使用 _GNU_SOURCEdefined 构建 C 源代码?

对于那些感兴趣的文件cov-int/build-log.txt可以在这里找到:
https://gist.github.com/DimitriPapadopoulos/0dcd9018eed26401cc6095087d9cc1d5

【问题讨论】:

  • 显然,Coverity 需要了解 _Float32_Float32x_Float64_Float64x_Float128 类型。在此之前,您可以通过将它们定义为宏来解决问题:将-D_Float32=float -D_Float64=double -D_Float32x=double -D_Float64x="long double" -D_Float128="long double" 添加到 gcc 命令行。但是请注意,_Float128-using 函数都不适用于此 hack。
  • 另外,如果您在Coverity_Float128_Float32_Float64_Float32x_Float64x 上进行网络搜索,您会发现this page,其中建议的“修复”与我上面的宏建议基本相同,只是在任何其他文件之前包含的外部头文件中。
  • 将这些类型定义为宏不起作用,因为/include/x86_64-linux-gnu/bits/floatn.h 包含typedef double _Float64;,但感谢您提供的总体思路和sssd 开发人员列表的链接。
  • 我试图摆脱_GNU_SOURCE,但不幸的是,在我们的代码库中调用 memmem()strcasestr() 需要它。

标签: c coverity ubuntu-18.04


【解决方案1】:

Coverity 未能定义 GCC 将定义的类型,但它仍然声称自己是 GCC。这是一个解决方法:https://gist.github.com/vathpela/0cede6d6eb5b0ec0791c6afc4282c340#file-fix_coverity-h

只要确保你这样做:

#include "fix_coverity.h"

stdlib.h 被直接或间接包含之前。

【讨论】:

    【解决方案2】:

    联系 Coverity 支持后,这似乎是一个已知错误。他们建议我通过从默认的 Ubuntu 18.04 编译器 (GCC 7) 切换到以前的版本 (GCC 6) 来解决这个问题:

    sudo apt install gcc-6
    

    确实_Float32_Float32x_Float64_Float64x_Float128introduced in GCC 7

    【讨论】:

      猜你喜欢
      • 2017-06-20
      • 1970-01-01
      • 2017-09-19
      • 2021-11-11
      • 1970-01-01
      • 2018-02-23
      • 2016-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多