Как сделать статический анализ 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 такие:
- набор цели и env (Wind River 4 Linux)
- очистить
- cov-configure с компилятором dir и типом
- cov-build с правильной командой make all, работающей в одиночку
- СОУ-анализа
- 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, такими как встроенные пространства имен.