1

我在 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。

4

2 回答 2

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)

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

此处对此进行了描述,并且链接的网页将提供有关自动依赖项生成的更多信息,而不是您认为可能存在的信息。

于 2016-07-20T19:32:14.720 回答
0

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

对我来说,该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命令(调用 from cov-build)不要发送到cov-emit任何传递这些参数的编译器调用。删除这两行解决了一切。

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

于 2016-07-26T12:36:50.403 回答