7

我正在使用 Wind River Compiler 4(gcc (C) 和 g++ (C++)),它可以毫无问题地编译我的所有项目。现在我必须使用 Coverity 静态分析来检查我的代码。我已经配置了特定的编译器。对于 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-Code 产生的:

#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

但结果没有改变。

测试代码在一个大的构建层次结构中,但 Coverity 的步骤如下:

  1. 目标和环境设置(Wind River 4 Linux)
  2. 打扫干净
  3. 带有编译器目录和类型的 cov-configure
  4. cov-build 使用正确的“make all”命令单独工作
  5. 共分析
  6. if (no_error) cov-commit-defects

我还配置了 Coverity 以在 cov-build ( --ppp-translator replace/inline namespace/namespace) 期间将所有“内联命名空间”替换为“命名空间”。内联错误消失了,但它会产生更多这种重载错误并且没有成功构建。还尝试以相同的方式删除“C++”,但没有奏效,总是有更多错误。

有人知道这里有什么问题吗?我怎样才能在没有错误的情况下获得 Coverity 构建?也许我可以将 Coverity 配置为忽略 C++ 标准头文件,但我现在不怎么做?

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 Support 的解决方法

内联命名空间是 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 的开头添加一个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 回答