由于 gcc -M 选项,Coverity 扫描跳过所有命令并且不扫描任何内容
Coverity scan skips all commands due to gcc -M option and scans nothing
我在 C/C++ 代码中使用 Coverity 时遇到一些问题。
当我 运行 cov-build
和 --debug-flags translate-phases
时,我得到的输出表明由于 -M
标志,所有编译器调用都被跳过。本质上(在运行宁cov-build
:
之后阅读build-log.txt
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
的 second 调用,因为它不包含 -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,链接的网页将提供比您想象的更多关于自动依赖项生成的信息。
我大约两个小时前想出了答案。
对我来说,cov-configure
命令生成了五个不同的配置工件(其中 2-5 个是文件夹):
- 主配置文件
- g++-config-0
- g++-config-1
- gcc-config-0
- gcc-config-1
我真的不知道为什么它决定给我四个文件夹,每种类型的编译器两个,但无论如何。
这四个文件夹中的每一个都有一个 coverity_configuration.xml
文件。所有这些都包含以下行:
<skip_arg>-M</skip_arg>
<skip_arg>-MM</skip_arg>
阅读此标记,它告诉 cov-translate
命令(从 cov-build
调用)不要向 cov-emit
发送任何传递这些参数的任何编译器调用。删除这两行解决了所有问题。
我不能说为什么这两个标签默认放在那里。但现在可以了。
我在 C/C++ 代码中使用 Coverity 时遇到一些问题。
当我 运行 cov-build
和 --debug-flags translate-phases
时,我得到的输出表明由于 -M
标志,所有编译器调用都被跳过。本质上(在运行宁cov-build
:
build-log.txt
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
的 second 调用,因为它不包含 -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,链接的网页将提供比您想象的更多关于自动依赖项生成的信息。
我大约两个小时前想出了答案。
对我来说,cov-configure
命令生成了五个不同的配置工件(其中 2-5 个是文件夹):
- 主配置文件
- g++-config-0
- g++-config-1
- gcc-config-0
- gcc-config-1
我真的不知道为什么它决定给我四个文件夹,每种类型的编译器两个,但无论如何。
这四个文件夹中的每一个都有一个 coverity_configuration.xml
文件。所有这些都包含以下行:
<skip_arg>-M</skip_arg>
<skip_arg>-MM</skip_arg>
阅读此标记,它告诉 cov-translate
命令(从 cov-build
调用)不要向 cov-emit
发送任何传递这些参数的任何编译器调用。删除这两行解决了所有问题。
我不能说为什么这两个标签默认放在那里。但现在可以了。