Статический анализатор для C/C++
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; }
Статический анализ выполняется индивидуально для каждой целевой архитектуры с учётом макроопределений, по умолчанию задаваемых соответствующим кросс-компилятором. Полный список используемых в процессе анализа опций и макроопределений может быть отображён при указании дополнительного параметра V=2 (см. описание управляющих переменных модуля cppcheck.mk сборочной подсистемы ). |
cppcheck
обладает встроенным механизмом приоритетов, влияющим на процесс загрузки конфигурационных файлов (*.cfg). Конфигурационные файлы, указанные в качестве аргументов опции –library, загружаются последовательно: например, при указании –library=posix,bsd,kpda сначала (в любом случае) будет загружен std.cfg, а затем (по порядку) posix.cfg, bsd.cfg и kpda.cfg. При этом версия анализатора cppcheck
, входящая в состав Комплекта разработчика, имеет следующее отличие от стандартной: в случае наличия нескольких описаний одной и той же функции в одном или нескольких конфигурационных файлах, cppcheck из состава КР при загрузке нового описания функции выполнит предварительный сброс ранее загруженного описания, т.е. результирующим для данной функции будет вариант конфигурации, загруженный последним. При выполнении статического анализа с помощью команды make cppcheck по умолчанию используются следующие конфигурационные файлы (перечислены в порядке загрузки):
|
Статический анализатор cppcheck
позволяет создавать собственные конфигурационные файлы (cfg) и правила проверки (rules), которые могут учитывать специфику разрабатываемых проектов или используемых в них библиотек при выполнении анализа исходного кода. При разработке правил активно используется механизм регулярных выражений (regex). Статьи и материалы по данной теме:
Ниже приведён ряд ссылок на разработки сторонних авторов, которые можно использовать в качестве примеров, а также для углублённого изучения статического анализатора cppcheck:
Предыдущий раздел: Тематические статьи