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

最佳答案

-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对此进行了描述,并且链接的网页将提供有关自动依赖项生成的更多信息,而这超出了您的想象。

10-08 11:53