Interested Article - Cppcheck
- 2021-03-24
- 1
Cppcheck — статический анализатор кода для языка C / C++ , предназначенный для поиска ошибок, которые не обнаруживаются компиляторами. Главной целью проекта является сведение до минимума количества ложных срабатываний при поиске ошибок .
Анализатор способен проверять нестандартные участки кода, включающие использование расширений компилятора , встраиваемый ассемблер и т. п.
Возможности
Обнаруживает различные типы ошибок в программах .
- Проверяет выход за пределы.
- Обнаруживает утечки памяти .
- Обнаруживает возможное разыменовывание NULL -указателей.
- Обнаруживает неинициализированные переменные.
- Обнаруживает неправильное использование STL .
- Проверяет обработку исключительных ситуаций на безопасность.
- Находит устаревшие и неиспользуемые функции.
- Предупреждает о неиспользуемом или бесполезном коде.
- Находит подозрительные участки кода, которые могут содержать в себе ошибки.
Также позволяет скачивать и подключать правила и дополнения из репозиториев cppcheck. Собственные правила для проверок могут быть добавлены посредством регулярных выражений .
Возможно уточнение стандарта, которому соответствует проверяемый код. Поддерживаются следующие стандарты: C89 , C99 , C11 , C++03 , C++11 , POSIX . При этом одновременно можно указывать несколько стандартов сразу (например, С11 и POSIX) .
Помимо стандарта можно указать целевую платформу для более точного определения ошибок. Каждая платформа определяет размеры базовых типов данных и специфичные для платформы типы данных . Среди доступных можно указать UNIX-подобную операционную систему либо операционную систему Windows разрядностью 32 или 64 бита .
Особенности статического анализа
Перед выполнением
статического анализа
исходный код преобразуется в представление, удобное для дальнейшего анализа. Программа удаляет все комментарии, подставляет вместо
макросов
их определения, заменяет все переопределения типов на оригинальные типы данных, приводит код к единому стилю оформления. Если значения переменных известны, то вместо названий переменных подставляются их значения. К названиям переменных добавляются их уникальные идентификаторы в рамках программы, что упрощает дальнейший анализ использования переменных. Например,
int a;
может быть заменено на
int a@1;
, если переменная объявлена первой в программе. Также производятся и другие упрощения кода, предназначенные для облегчения анализа. Следующим этапом идёт проверка кода согласно загруженным в программу правилам, которые сопоставляют код с шаблонами критических и стилевых ошибок. Самые простые правила могут основываться на использовании регулярных выражений
.
Поскольку реального исполнения кода не происходит, то выдаваемые анализатором сообщения об ошибках могут в действительности указывать на корректно написанный код, что называют ложными срабатываниями. Также возможны ситуации, когда найденная ошибка никогда не сможет проявиться при исполнении кода.
Использование
Работа с Cppcheck производится из командной строки. Начиная с версии 1.33, также доступен кроссплатформенный графический интерфейс, написанный на Qt .
Для анализа одного или нескольких исходных файлов достаточно запустить программу cppcheck, передав ей в качестве аргументов пути к проверяемым файлам. Если вместо имени файла указать каталог, программа будет осуществлять рекурсивный обход каталога и анализировать все компилируемые файлы в нём .
Пример запуска анализа нескольких файлов и каталога на UNIX-подобных операционных системах :
cppcheck test1.c test2.c relative/path/test3.c /absolute/path/test4.c project/src/
Пример проверки файла
Рассмотрим пример программы на языке
Си
с ошибкой, из-за которой перепутаны местами индекс массива и его размер. Файл
test.c
:
#include <stdlib.h>
#include <stdio.h>
int main()
{
char s[255];
s[255] = '\0';
return EXIT_SUCCESS;
}
Для проверки файла
test.c
на ошибки с помощью Cppcheck необходимо исполнить следующую команду:
cppcheck test.c
После исполнения команды будет показано сообщение об ошибке выхода за пределы массива при обращении к переменной
s
:
[test.c:7]: (error) Array 's[255]' accessed at index 255 which is out of bounds.
Интеграция с инструментами разработки
Поддерживает интеграцию с различными инструментами разработки :
- (плагин от 4 августа 2016 на Wayback Machine );
- Code::Blocks (плагин от 19 января 2016 на Wayback Machine );
- ;
- CodeLite (плагин );
- ;
- Eclipse (плагин от 10 апреля 2016 на Wayback Machine );
- Jenkins (плагин от 27 января 2016 на Wayback Machine );
- Mercurial (через ) — проверяет на наличие новых ошибок при создании коммита;
- TortoiseSVN — выполнение скрипта перед созданием коммита ;
- Git (через от 24 декабря 2015 на Wayback Machine ) — проверяет файлы, добавляемые в коммит, на наличие ошибок;
- Visual Studio (плагин от 11 сентября 2020 на Wayback Machine );
- Qt Creator (плагин от 7 января 2017 на Wayback Machine ).
См. также
- Динамический анализ кода
- Valgrind (динамический анализатор)
Примечания
- — 2023.
- . cppcheck.sourceforge.net. Дата обращения: 21 января 2016. 18 января 2016 года.
- ↑ . Дата обращения: 21 января 2016. 5 марта 2016 года.
- . sourceforge.net. Дата обращения: 21 января 2016. 26 декабря 2015 года.
- (англ.) . GitHub. Дата обращения: 21 января 2016. 24 декабря 2015 года.
- (англ.) . GitHub. Дата обращения: 21 января 2016. 24 декабря 2015 года.
- ↑ (англ.) . manpages.ubuntu.com. Дата обращения: 31 января 2016. 25 апреля 2016 года.
- Daniel Marjamäki. (англ.) : сайт. — 2010. 13 марта 2016 года.
- . sourceforge.net. Дата обращения: 8 марта 2016. 14 марта 2016 года.
- . sourceforge.net. Дата обращения: 21 января 2016. 27 декабря 2015 года.
- (англ.) . codedx.com. Дата обращения: 31 января 2016. 31 января 2016 года.
- CoderGears, . . www.cppdepend.com. Дата обращения: 31 января 2016. 17 февраля 2016 года.
- . Omerez. Дата обращения: 21 января 2016. 21 января 2016 года.
Ссылки
- от 5 марта 2016 на Wayback Machine (англ.)
- от 27 января 2016 на Wayback Machine , Хабрахабр, 31 января 2014 (рус.)
- 2021-03-24
- 1