C++ Coverity scan由于gcc-M选项而跳过所有命令,不扫描任何内容

C++ Coverity scan由于gcc-M选项而跳过所有命令,不扫描任何内容,c++,gcc,coverity,C++,Gcc,Coverity,我在C/C++代码中使用Coverity时遇到一些问题 当我使用--debug flags translate phases运行cov build时,我得到的输出表明,由于-M标志,所有编译器调用都被跳过。基本上(运行cov build后读取build log.txt: ARGS after split: -M -MP <other commands follow> 拆分后的参数:-M-MP 然后是下一行: Skipping command line '-M -MP <ot

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

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

ARGS after split: -M -MP <other commands follow>
拆分后的参数:-M-MP 然后是下一行:

Skipping command line '-M -MP <other commands follow>' because argument '-M' is a skip argument 
跳过命令行'-M-MP',因为参数'-M'是跳过参数
这似乎导致Coverity无法编译我的任何文件,因此不会产生任何输出

Coverity是否只是不支持
-M
标志?是否有解决方法


为了完整性,我使用Coverity Scan 7.6.1和gcc 4.8.2。

-M
传递给编译器意味着
-E
,即只运行预处理器。因此,Coverity在这里什么都不做。但是,没有理由不继续第二次调用不包含de
-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)
#魔术就在这一行
DEPFLAGS=-MMD-MP-MT$@-MF$(@D)/$(*F).D
#请记住将空格更改为此处的制表符!
#无论如何,这只是一个例子。你需要做的就是添加
#$(DEPFLAGS)转换为通常的C编译规则。
.c.o.:
$(CC)$(CFLAGS)$(CPPFLAGS)$(DEPFLAGS)-c-o$@$<
同样的C++
.cc.o:
$(CXX)$(CXXFLAGS)$(CPPFLAGS)$(DEPFLAGS)-c-o$@$<
#在makefile的末尾,包含依赖项
-包括$(通配符*.d)
如果您有一个非递归的Makefile,您可能需要类似于
-include$(通配符*/*.d*.d)
的内容。但是这一部分可能与您现有的规则非常相似


这已被描述,链接的网页将提供比您想象的更多的关于自动依赖项生成的信息。

我大约在两小时前找到了答案

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

  • 主配置文件
  • g++-config-0
  • g++-config-1
  • gcc-config-0
  • gcc-config-1
  • 我真的不知道为什么它决定给我四个文件夹,每种编译器两个,但无论如何

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

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


    我不知道为什么这两个标签默认放在那里。但它现在可以工作了。

    是的……Coverity是一个很棒的工具,它有一些文档空白:)基于日志项“…参数“-M”是一个跳过参数…”,我猜它不受支持(但只是一个猜测)。总而言之:您为什么要求Coverity分析生成依赖项的规则输出?虽然您的回答很有趣,我对此表示感谢,但我无权以任何方式更改构建过程的工作方式。所以不幸的是,这个答案并没有真正的帮助。@Jokab但是您的构建过程在调用
    -M
    之后是否会再次执行GCC?(我对“有无”代码> CaveBug < /C> >的回答都有兴趣。每个GCC都有两个,如C,GCC为C++,G+C++为C,G+++为C++<代码> -M>代码>是<代码> SkIPARG < /COD>。因为编译< <代码> -M>代码>实际上不编译任何东西。您需要后续的实际编译,Coverity将编译这些编译。这就是保罗的回答。你做了一个干净的构建吗?可能只看到
    -M
    调用的原因是因为您的所有构建工件都是最新的,因此
    make
    确定不需要编译(但是仍然需要
    -M
    调用来确保依赖项是最新的)。@Caleb I总是进行干净的构建。我正在处理的构建过程非常复杂,而且我对C/C++构建过程不是很有经验,这使得我很难准确地理解正在发生的事情。无论如何,移除这两个标签让Coverity看到了我的代码,现在它可以工作了。