7

Wind River Compiler 4 (gcc (C) および g++ (C++)) を使用していますが、すべてのプロジェクトを問題なくコンパイルできます。ここで、Coverity Static Analysis を使用してコードをチェックする必要があります。特定のコンパイラを構成しました。C コード (gcc) では問題はなく、解析を実行できますが、C++ コード (g++) では多くのエラーが発生しました。

.../c++config.h", line 214: error #40:
    expected an identifier
inline namespace __gnu_cxx_ldbl128 { }
       ^

.../c++config.h", line 214: error #326:
    inline specifier allowed on function declarations only
inline namespace __gnu_cxx_ldbl128 { }
^

.../c++config.h", line 214: error #65:
    expected a ";"
inline namespace __gnu_cxx_ldbl128 { }
                                   ^
.../include/string.h", line 76: error #312:
    cannot overload functions distinguished by return type alone
extern __const void *memchr (__const void *__s, int __c, size_t __n)
                     ^

.../include/string.h", line 116: error #312:
    cannot overload functions distinguished by return type alone
extern "C++" __const void *memchr (__const void *__s, int __c, size_t __n)
                     ^

インライン名前空間のような C++11 固有の機能のようですが、コードはこれらの機能を使用していません。上記のエラーは、HelloWorld コードで生成されます。

#include "stdio.h"
#include "util.h"
#include <string>
#include "string.h"

using namespace std;

int main()
{
    printf("Hello World, C++ version: %d.%d.%d\r\n",__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__);

    return 0;
}

g++ オプションを使用して C++ 標準を設定しようとしました

-std=c++98

しかし、結果は変わりません。

Test-Code は大きなビルド階層にありますが、Coverity の手順は次のようになります。

  1. ターゲットと環境セット (Wind River 4 Linux)
  2. きれいにする
  3. コンパイラのディレクトリとタイプを使用した cov-configure
  4. 単独で動作する正しい「make all」コマンドを使用した cov-build
  5. cov-分析
  6. if (no_error) cov-commit-defects

また、cov-build 中にすべての「インライン名前空間」を「名前空間」に置き換えるように Coverity を構成しました ( --ppp-translator replace/inline namespace/namespace)。インライン エラーは消えましたが、この過負荷エラーがさらに発生し、正常にビルドされません。また、同じ方法で「C++」を削除しようとしましたが、うまくいきませんでした。常により多くのエラーが発生します。

ここで何が問題なのか、誰にも分かりますか?また、Coverity ビルドをエラーなしで入手するにはどうすればよいですか? C++ 標準ヘッダーを無視するように Coverity を構成することはできるかもしれませんが、その方法はわかりません。

4

3 に答える 3

5

ライブラリの実装はC++11を使用しています。おそらく#ifdefs、g++を呼び出すときにすべてのC++ 11のものを削除するものがありますが-std=c++98、Coverityはg ++と統合されているようですが、C++11機能を回避するために必要なものと同じものを定義していません。

gccがそのC++11コードの周りで使用するマクロが何であるかを理解し、プロジェクトを分析するときにCoverityがそれらを適切に定義していることを確認する必要があります。

于 2012-01-19T15:25:22.653 に答える
5

Coverity サポートによる回避策:

インライン名前空間は、Coverity の既知のバグです。これをバイパスするには、次の追加オプションを使用して Coverity を構成します (構成ファイル内)。

  <begin_command_line_config></begin_command_line_config> 
  <add-arg>--ppp_translator</add_arg> 
  <add_arg>replace/inline namespace ([_a-zA-Z0-9]*)\s+\{\s*\}/namespace $1 { } using namespace $1;</add_arg> 
</options>

その後、いくつかのエラーが発生しましたが、それらはすべて文字列定義に属しているようです。ここで、coverity-compiler-compat.h の先頭 (config ディレクトリにもあります) に Coverity の定義を追加します。

#define __COVERITY_NO_STRING_NODEFS__

これらの変更後、cov-build はエラーなしで実行され、分析を開始できます。

于 2012-01-27T09:20:33.870 に答える
0

このエラーはそれを非常に明確に示しています:

関数宣言でのみ許可されるインライン指定子

名前空間が である理由はありますinlineか? 仕様を入手できないため、許可されているかどうかはわかりません。(コンパイラが許可するのは、GCC のバグかもしれません。)

それを取り除こうinlineとすれば、Coverity が幸せになることを願っています。

Coverity は、インライン名前空間などの一部の C++11 機能で更新されていないようです。

于 2012-01-19T15:06:11.730 に答える