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 はここでは何もしません。ただし、 2 番目の呼び出しを続行してはならない理由はgccありません。これには、コンパイルが含まれていない-Mため、コンパイルが実行されます。

-Mとはいえ、依存関係を自動的に生成するには、古いフラグよりも優れた方法があります。特に GCC の新しいバージョンでは、単一のコマンドでコンパイルと依存関係の生成を行うことができます。関連するメイクファイルのイディオムは次のとおりです。

# 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 がある場合のようなものが必要になる場合があります。しかし、この部分はおそらく既存のルールと非常によく似ています。

これはここで説明されており、リンク先の Web ページには、依存関係の自動生成に関するより多くの情報が記載されています。

于 2016-07-20T19:32:14.720 に答える
0

私は約2時間前に答えを見つけました。

私の場合、cov-configureコマンドは 5 つの異なる構成アーティファクトを生成しました (2 ~ 5 はフォルダーです)。

  1. メイン構成ファイル
  2. g++-config-0
  3. g++-config-1
  4. gcc-config-0
  5. gcc-config-1

コンパイラの種類ごとに 2 つずつ、合計 4 つのフォルダを提供することにした理由はよくわかりませんが、とにかく。

これら 4 つのフォルダーのそれぞれにcoverity_configuration.xmlファイルがありました。これらにはすべて次の行が含まれていました。

<skip_arg>-M</skip_arg>
<skip_arg>-MM</skip_arg>

このタグを読み取ると、これらの引数のいずれかを渡すコンパイラ呼び出しに送信しないようにcov-translateコマンド (から呼び出される) に指示します。これらの2行を削除すると、すべてが解決しました。cov-buildcov-emit

これらの 2 つのタグがデフォルトでそこに配置された理由はわかりません。しかし、それは今動作します。

于 2016-07-26T12:36:50.403 に答える