Как сделать статический анализ Coverity совместимым со стандартом C++0x?

Я использую 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-кода:

#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;
}

Я попытался установить стандарт C++ с опцией g ++

-std=c++98

но результат не изменился.

Тест-код находится в большой иерархии сборки, но шаги для Coverity такие:

  1. набор цели и env (Wind River 4 Linux)
  2. очистить
  3. cov-configure с компилятором dir и типом
  4. cov-build с правильной командой make all, работающей в одиночку
  5. СОУ-анализа
  6. if (no_error) cov-commit-дефектов

Я также настроил Coverity для замены всего "встроенного пространства имен" на "пространство имен" во время сборки cov (--ppp-translator replace/inline namespace/namespace). Встроенные ошибки исчезли, но это приводит к большему количеству этих ошибок перегрузки и не приводит к успешной сборке. Также пытался удалить "C++" таким же образом, но не работал, всегда есть больше ошибок.

У кого-нибудь есть идея, в чем здесь проблема? А как можно получить сборку Coverity без ошибок? Может быть, я могу настроить Coverity так, чтобы он игнорировал стандартные заголовки C++, но не знаю как?

3 ответа

Решение

Обходной путь поддержки 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 в начале coverity-compiler-compat.h (также в директории config):

#define __COVERITY_NO_STRING_NODEFS__

После этих изменений cov-build работает без ошибок и анализ может быть запущен.

Ваша реализация библиотеки использует C++11. Предположительно есть #ifdefs которые удаляют все содержимое C++ 11, когда вы вызываете g ++ с -std=c++98 но, похоже, что Coverity интегрирован с g ++, он не определяет те же вещи, которые необходимы, чтобы избежать функций C++11.

Вы должны выяснить, какие макросы использует gcc для этого кода C++ 11, а затем убедиться, что Coverity определяет их соответствующим образом, когда анализирует ваш проект.

Эта ошибка говорит об этом довольно четко:

встроенный спецификатор разрешен только для объявлений функций

Есть ли причина, по которой пространство именinline? Хотя у меня нет доступных спецификаций, я не могу сказать вам, разрешено это или нет. (То, что компилятор допускает это, может быть ошибкой в ​​GCC.)

Попробуйте удалить этоinlineи Coverity будет, надеюсь, счастливым.

Кажется, что Coverity не был обновлен некоторыми функциями C++11, такими как встроенные пространства имен.

Другие вопросы по тегам