Cppcheck
Cppcheck — статический анализатор кода для языка C/C++, предназначенный для поиска ошибок, которые не обнаруживаются компиляторами. Главной целью проекта является сведение до минимума количества ложных срабатываний при поиске ошибок. Анализатор способен проверять нестандартные участки кода, включающие использование расширений компилятора, встраиваемый ассемблер и т. п.
| Cppcheck | |
|---|---|
| | |
| | |
| Тип | Статический анализатор кода |
| Написана на | C++ |
| Операционная система | Unix-подобная операционная система |
| Дата выпуска | 8 мая 2007 |
| Последняя версия | |
| Репозиторий | github.com/danmar/cppche… |
| Лицензия | GPLv3 |
| Сайт | cppcheck.sourceforge.net |
Cppcheck — статический анализатор кода для языка C/C++, предназначенный для поиска ошибок, которые не обнаруживаются компиляторами. Главной целью проекта является сведение до минимума количества ложных срабатываний при поиске ошибок[2].
Анализатор способен проверять нестандартные участки кода, включающие использование расширений компилятора, встраиваемый ассемблер и т. п.[3]
Возможности
[править | править код]Обнаруживает различные типы ошибок в программах[4].
- Проверяет выход за пределы.
- Обнаруживает утечки памяти.
- Обнаруживает возможное разыменовывание NULL-указателей.
- Обнаруживает неинициализированные переменные.
- Обнаруживает неправильное использование STL.
- Проверяет обработку исключительных ситуаций на безопасность.
- Находит устаревшие и неиспользуемые функции.
- Предупреждает о неиспользуемом или бесполезном коде.
- Находит подозрительные участки кода, которые могут содержать в себе ошибки.
Также позволяет скачивать и подключать правила[5] и дополнения[6] из репозиториев cppcheck. Собственные правила для проверок могут быть добавлены посредством регулярных выражений[3].
Возможно уточнение стандарта, которому соответствует проверяемый код. Поддерживаются следующие стандарты: C89, C99, C11, C++03, C++11, POSIX. При этом одновременно можно указывать несколько стандартов сразу (например, С11 и POSIX)[7].
Помимо стандарта можно указать целевую платформу для более точного определения ошибок. Каждая платформа определяет размеры базовых типов данных и специфичные для платформы типы данных[3]. Среди доступных можно указать UNIX-подобную операционную систему либо операционную систему Windows разрядностью 32 или 64 бита[7].
Особенности статического анализа
[править | править код]Перед выполнением статического анализа исходный код преобразуется в представление, удобное для дальнейшего анализа. Программа удаляет все комментарии, подставляет вместо макросов их определения, заменяет все переопределения типов на оригинальные типы данных, приводит код к единому стилю оформления. Если значения переменных известны, то вместо названий переменных подставляются их значения. К названиям переменных добавляются их уникальные идентификаторы в рамках программы, что упрощает дальнейший анализ использования переменных. Например, int a; может быть заменено на int a@1;, если переменная объявлена первой в программе. Также производятся и другие упрощения кода, предназначенные для облегчения анализа. Следующим этапом идёт проверка кода согласно загруженным в программу правилам, которые сопоставляют код с шаблонами критических и стилевых ошибок. Самые простые правила могут основываться на использовании регулярных выражений[8].
Поскольку реального исполнения кода не происходит, то выдаваемые анализатором сообщения об ошибках могут в действительности указывать на корректно написанный код, что называют ложными срабатываниями. Также возможны ситуации, когда найденная ошибка никогда не сможет проявиться при исполнении кода.
Использование
[править | править код]Работа с Cppcheck производится из командной строки. Начиная с версии 1.33, также доступен кроссплатформенный графический интерфейс, написанный на Qt[9].
Для анализа одного или нескольких исходных файлов достаточно запустить программу cppcheck, передав ей в качестве аргументов пути к проверяемым файлам. Если вместо имени файла указать каталог, программа будет осуществлять рекурсивный обход каталога и анализировать все компилируемые файлы в нём[3].
Пример запуска анализа нескольких файлов и каталога на 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.
Интеграция с инструментами разработки
[править | править код]Поддерживает интеграцию с различными инструментами разработки[10]:
- Clion (плагин cppcheck Архивная копия от 4 августа 2016 на Wayback Machine);
- Code::Blocks (плагин CppCheck Архивная копия от 19 января 2016 на Wayback Machine);
- CodeDX[11];
- CodeLite (плагин CppCheck);
- CppDepend 5[12];
- Eclipse (плагин Cppcheclipse Архивная копия от 10 апреля 2016 на Wayback Machine);
- Jenkins (плагин Cppcheck Архивная копия от 27 января 2016 на Wayback Machine);
- Mercurial (через скрипты на Linux) — проверяет на наличие новых ошибок при создании коммита;
- TortoiseSVN — выполнение скрипта перед созданием коммита[13];
- Git (через скрипты на Linux Архивная копия от 24 декабря 2015 на Wayback Machine) — проверяет файлы, добавляемые в коммит, на наличие ошибок;
- Visual Studio (плагин cppcheck-vs-addin Архивная копия от 11 сентября 2020 на Wayback Machine);
- Qt Creator (плагин QtcCppheck Архивная копия от 7 января 2017 на Wayback Machine).
См. также
[править | править код]- Динамический анализ кода
- Valgrind (динамический анализатор)
Примечания
[править | править код]- ↑ Release 2.20.0 — 2026.
- ↑ Cppcheck - A tool for static C/C++ code analysis. cppcheck.sourceforge.net. Дата обращения: 21 января 2016. Архивировано 18 января 2016 года.
- ↑ 1 2 3 4 Мануал по Cppcheck версии 1.75. Дата обращения: 21 января 2016. Архивировано 5 марта 2016 года.
- ↑ cppcheck / Wiki / ListOfChecks. sourceforge.net. Дата обращения: 21 января 2016. Архивировано 26 декабря 2015 года.
- ↑ danmar/cppcheck - rules (англ.). GitHub. Дата обращения: 21 января 2016. Архивировано 24 декабря 2015 года.
- ↑ danmar/cppcheck - add ons (англ.). GitHub. Дата обращения: 21 января 2016. Архивировано 24 декабря 2015 года.
- ↑ 1 2 Ubuntu Manpage: cppcheck - Tool for static C/C++ code analysis (англ.). manpages.ubuntu.com. Дата обращения: 31 января 2016. Архивировано 25 апреля 2016 года.
- ↑ Daniel Marjamäki. Writing Cppcheck rules. Part 2 - The Cppcheck data representation (англ.) : сайт. — 2010. Архивировано 13 марта 2016 года.
- ↑ cppcheck / News: cppcheck-1.33. sourceforge.net. Дата обращения: 8 марта 2016. Архивировано 14 марта 2016 года.
- ↑ cppcheck / Wiki / Home. sourceforge.net. Дата обращения: 21 января 2016. Архивировано 27 декабря 2015 года.
- ↑ FAQ - (англ.). codedx.com. Дата обращения: 31 января 2016. Архивировано 31 января 2016 года.
- ↑ CoderGears, https://www.codergears.com/home. CppDepend :: Achieve higher C/C++ code quality. www.cppdepend.com. Дата обращения: 31 января 2016. Архивировано 17 февраля 2016 года.
- ↑ Automatic static code analysis before uploading your code. Omerez. Дата обращения: 21 января 2016. Архивировано 21 января 2016 года.
Ссылки
[править | править код]- Руководство по использованию Cppcheck Архивная копия от 5 марта 2016 на Wayback Machine (англ.)
- Тонкости анализа исходного кода C/C++ с помощью cppcheck Архивная копия от 27 января 2016 на Wayback Machine, Хабрахабр, 31 января 2014 (рус.)