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; s = '\0';

return EXIT_SUCCESS; }

Для проверки файла test.c на ошибки с помощью Cppcheck необходимо исполнить следующую команду: cppcheck test.c

После исполнения команды будет показано сообщение об ошибке выхода за пределы массива при обращении к переменной s:

[test.c:7]: (error) Array 's' accessed at index 255 which is out of bounds.

Интеграция с инструментами разработки Поддерживает интеграцию с различными инструментами разработки: Clion (плагин cppcheck ); Code::Blocks (плагин CppCheck ); CodeDX; CodeLite (плагин CppCheck); CppDepend 5; Eclipse (плагин Cppcheclipse ); Jenkins (плагин Cppcheck ); Mercurial (через скрипты на Linux) — проверяет на наличие новых ошибок при создании коммита; TortoiseSVN — выполнение скрипта перед созданием коммита; Git (через скрипты на Linux ) — проверяет файлы, добавляемые в коммит, на наличие ошибок; Visual Studio (плагин cppcheck-vs-addin ); Qt Creator (плагин QtcCppheck ).

См. также Динамический анализ кода Valgrind (динамический анализатор)

Примечания

Ссылки Руководство по использованию Cppcheck Тонкости анализа исходного кода C/C++ с помощью cppcheck , Хабрахабр, 31 января 2014

Категория:Статические анализаторы кода Категория:Свободное кроссплатформенное программное обеспечение Категория:Свободное программное обеспечение, написанное на C++