Использование статического анализатора cppcheck

Статический анализатор для C/C++

Основные отличия от стандартной версии cppcheck
Использование рекурсивной сборочной подсистемы
Приоритет конфигурационных файлов
Создание пользовательских правил

Основные отличия от стандартной версии cppcheck

Статический анализатор cppcheck, входящий в состав Комплекта разработчика для ЗОСРВ "Нейтрино" (далее - КР) обладает рядом отличий от стандартной версии версии:

Использование рекурсивной сборочной подсистемы

Рекурсивная сборочная подсистема ЗОСРВ "Нейтрино" позволяет выполнять статический анализ проекта посредством выполнения команды make cppcheck (подробное описание цели cppcheck и дополнительных параметров доступно в описании модуля cppcheck.mk сборочной подсистемы). Пример выполнения статического анализа проекта:

$ cd helloworld $ ls common.mk helloworld.c Makefile nto $ make CPULIST=x86 EXCLUDE_VARIANTLIST=g CPPCHECK_DESTDIR=/tmp cppcheck make -C nto -fMakefile cppcheck make[1]: Entering directory '/home/user/helloworld/nto' make -C x86 -fMakefile cppcheck make[2]: Entering directory '/home/user/helloworld/nto/x86' make -C o -fMakefile cppcheck make[3]: Entering directory '/home/user/helloworld/nto/x86/o' cppcheck: version "Cppcheck 2.6 (kpda_210d40b81c_b181_20211012)" cppcheck: CPPCHECK_SEVERITY: warning cppcheck: CPPCHECK_LIBRARY: posix,bsd,kpda cppcheck: CPPCHECK_RULES: --rule-file=/opt/kpda2021/host/linux64/x86_64/usr/share/cppcheck/rules/kpda.xml cppcheck: CPPCHECK_FLAGS (extra options): cppcheck: errors found (see /tmp/00_recursive_helloworld_nto_x86.cppcheck) make[2]: Leaving directory '/home/user/helloworld/nto/x86' make[1]: Leaving directory '/home/user/helloworld/nto' $ cat /tmp/00_recursive_helloworld_nto_x86.cppcheck /home/user/helloworld/helloworld.c:4:3: error: Array 'a[4]' accessed at index 4, which is out of bounds. [arrayIndexOutOfBounds] a[4]='e'; ^ $ cat helloworld.c #include <stdio.h> int main(void) { char a[4]; a[4]='e'; /* intentional error (e.g. off-by-one) */ printf("Hello, World!\n"); return 42; }


Note: Статический анализ выполняется индивидуально для каждой целевой архитектуры с учётом макроопределений, по умолчанию задаваемых соответствующим кросс-компилятором. Полный список используемых в процессе анализа опций и макроопределений может быть отображён при указании дополнительного параметра V=2 (см. описание управляющих переменных модуля cppcheck.mk сборочной подсистемы).

Приоритет конфигурационных файлов

Анализатор cppcheck обладает встроенным механизмом приоритетов, влияющим на процесс загрузки конфигурационных файлов (*.cfg). Конфигурационные файлы, указанные в качестве аргументов опции –library, загружаются последовательно: например, при указании –library=posix,bsd,kpda сначала (в любом случае) будет загружен std.cfg, а затем (по порядку) posix.cfg, bsd.cfg и kpda.cfg. При этом версия анализатора cppcheck, входящая в состав Комплекта разработчика, имеет следующее отличие от стандартной: в случае наличия нескольких описаний одной и той же функции в одном или нескольких конфигурационных файлах, cppcheck из состава КР при загрузке нового описания функции выполнит предварительный сброс ранее загруженного описания, т.е. результирующим для данной функции будет вариант конфигурации, загруженный последним.

Note: При выполнении статического анализа с помощью команды make cppcheck по умолчанию используются следующие конфигурационные файлы (перечислены в порядке загрузки):
  1. std.cfg (конфигурация по умолчанию)
  2. posix.cfg (соответствие POSIX-стандартам)
  3. bsd.cfg (элементы API, характерные для BSD-систем, присутствующие в ЗОСРВ "Нейтрино")
  4. kpda.cfg (элементы, специфичные для ЗОСРВ "Нейтрино", в т.ч. коррекция ранее загруженных стандартных конфигурационных файлов)

Создание пользовательских правил

Статический анализатор cppcheck позволяет создавать собственные конфигурационные файлы (cfg) и правила проверки (rules), которые могут учитывать специфику разрабатываемых проектов или используемых в них библиотек при выполнении анализа исходного кода. При разработке правил активно используется механизм регулярных выражений (regex). Статьи и материалы по данной теме:

Сторонние проекты (примеры, статьи)

Ниже приведён ряд ссылок на разработки сторонних авторов, которые можно использовать в качестве примеров, а также для углублённого изучения статического анализатора cppcheck:




Предыдущий раздел: Тематические статьи