Статический анализатор для 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:
Предыдущий раздел: Тематические статьи