我在使用我的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。
答案 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是文件夹):
我真的不知道为什么它决定给我四个文件夹,每种类型的编译器都有两个,但无论如何。
这四个文件夹中的每一个都是coverity_configuration.xml
文件。所有这些都包含以下几行:
<skip_arg>-M</skip_arg>
<skip_arg>-MM</skip_arg>
读取此标记,它告诉cov-translate
命令(从cov-build
调用)不向cov-emit
发送任何传递这些参数的编译器调用。删除这两行解决了所有问题。
我无法说明为什么这两个标签默认放在那里。但它现在有效。