由于 gcc -M 选项,Coverity 扫描跳过所有命令并且不扫描任何内容

Coverity scan skips all commands due to gcc -M option and scans nothing

我在 C/C++ 代码中使用 Coverity 时遇到一些问题。

当我 运行 cov-build--debug-flags translate-phases 时,我得到的输出表明由于 -M 标志,所有编译器调用都被跳过。本质上(在运行宁cov-build:

之后阅读build-log.txt
ARGS after split: -M -MP <other commands follow>

然后下一行:

Skipping command line '-M -MP <other commands follow>' because argument '-M' is a skip argument 

这似乎导致 Coverity 不编译我的任何文件,因此不产生任何输出。

Coverity 是否根本不支持 -M 标志?有什么解决方法吗?

为了完整起见,我使用的是 Coverity Scan 7.6.1 和 gcc 4.8.2。

-M 传递给编译器意味着 -E,即仅 运行 预处理器。因此,Coverity 在这里根本不做任何事情。但是,没有理由不继续 gccsecond 调用,因为它不包含 -M 并因此进行编译。

也就是说,有比旧的 -M 标志更好的自动生成依赖项的方法;特别是较新版本的 GCC 允许您使用单个命令进行编译和生成依赖项。相关的 makefile 习惯用法是这样的:

# the magic is all in this line
DEPFLAGS     = -MMD -MP -MT $@ -MF $(@D)/$(*F).d

# remember to change the spaces to tab here!
# anyway this is just an example.  All you need to do is to add
# $(DEPFLAGS) to your usual C compilation rule.
.c.o:
        $(CC) $(CFLAGS) $(CPPFLAGS) $(DEPFLAGS) -c -o $@ $<

# same for C++
.cc.o:
        $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(DEPFLAGS) -c -o $@ $<

# at the end of the makefile, include the dependencies
-include $(wildcard *.d)

如果您有非递归 Makefile,您可能需要 -include $(wildcard */*.d *.d) 之类的东西。但这部分可能与您现有的规则非常相似。

对此进行了描述 here,链接的网页将提供比您想象的更多关于自动依赖项生成的信息。

我大约两个小时前想出了答案。

对我来说,cov-configure 命令生成了五个不同的配置工件(其中 2-5 个是文件夹):

  1. 主配置文件
  2. g++-config-0
  3. g++-config-1
  4. gcc-config-0
  5. gcc-config-1

我真的不知道为什么它决定给我四个文件夹,每种类型的编译器两个,但无论如何。

这四个文件夹中的每一个都有一个 coverity_configuration.xml 文件。所有这些都包含以下行:

<skip_arg>-M</skip_arg>
<skip_arg>-MM</skip_arg>

阅读此标记,它告诉 cov-translate 命令(从 cov-build 调用)不要向 cov-emit 发送任何传递这些参数的任何编译器调用。删除这两行解决了所有问题。

我不能说为什么这两个标签默认放在那里。但现在可以了。