Как сделать статический анализ Coverity совместимым со стандартом C ++ 0x? - PullRequest
7 голосов
/ 19 января 2012

Я использую Wind River Compiler 4 (gcc (C) и g ++ (C ++)), и он без проблем компилирует все мои проекты.Теперь я должен использовать статический анализ Coverity для проверки моего кода.Я настроил конкретные компиляторы.Для C-кода (gcc) проблем нет, и я могу запустить анализ, но для C ++ - Code (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. target и env set (Wind River 4 Linux)
  2. makeclean
  3. cov-configure с dir компилятора и введите
  4. cov-build с правильной командой "make all", которая работает в одиночку
  5. cov-analysis
  6. if (no_error) cov-commit-дефектов

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

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

Ответы [ 3 ]

5 голосов
/ 19 января 2012

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

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

4 голосов
/ 27 января 2012

Обходной путь поддержки 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 работает без ошибок и анализ может быть запущен.

0 голосов
/ 19 января 2012

Эта ошибка говорит об этом совершенно ясно:

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

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

Попробуйте удалить это inline, и, надеюсь, Coverity будет счастлив, что он счастлив.был обновлен некоторыми функциями C ++ 11, такими как встроенные пространства имен.

...