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

时间:2016-07-15 08:59:18

标签: c++ gcc coverity

我在使用我的C / C ++代码时使用Coverity时遇到了一些麻烦。

当我使用cov-build运行--debug-flags translate-phases时,我得到输出,表明由于-M标志而跳过所有编译器调用。基本上(在运行build-log.txt后阅读cov-build

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。

2 个答案:

答案 0 :(得分:1)

-M传递给编译器意味着-E,即仅运行预处理器。因此,Coverity在这里根本不做任何事情。但是,没有理由不继续进行gcc第二次调用,而不包括-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所描述的,链接的网页将提供有关自动依赖关系生成的更多信息,而不是您认为可能存在的信息。

答案 1 :(得分:0)

我在两小时前找到了答案。

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

  1. 主要配置文件
  2. 克++ - 配置-0
  3. 克++ - 配置-1
  4. GCC-CONFIG-0
  5. GCC-CONFIG-1
  6. 我真的不知道为什么它决定给我四个文件夹,每种类型的编译器都有两个,但无论如何。

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

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

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

    我无法说明为什么这两个标签默认放在那里。但它现在有效。