Cppcheck
Cppcheck | |
---|---|
Тип | Статический анализатор кода |
Написана на | C++ |
Лицензия | GPLv3 |
Ссылки | |
Сайт | cppcheck.sourceforge.net |
Cppcheck — статический анализатор кода для языка C/C++, предназначенный для поиска ошибок, которые не обнаруживаются компиляторами. Главной целью проекта является сведение до минимума количества ложных срабатываний при поиске ошибок[1].
Анализатор способен проверять нестандартные участки кода, включающие использование расширений компилятора, встраиваемый ассемблер и т. п.[2]
Возможности
Обнаруживает различные типы ошибок в программах[3].
- Проверяет выход за пределы.
- Обнаруживает утечки памяти.
- Обнаруживает возможное разыменовывание NULL-указателей.
- Обнаруживает неинициализированные переменные.
- Обнаруживает неправильное использование STL.
- Проверяет обработку исключительных ситуаций на безопасность.
- Находит устаревшие и неиспользуемые функции.
- Предупреждает о неиспользуемом или бесполезном коде.
- Находит подозрительные участки кода, которые могут содержать в себе ошибки.
Также позволяет скачивать и подключать правила[4] и дополнения[5] из репозиториев cppcheck. Собственные правила для проверок могут быть добавлены посредством регулярных выражений[2].
Возможно уточнение стандарта, которому соответствует проверяемый код. Поддерживаются следующие стандарты: C89, С99, С11, С++03, С++11, POSIX. При этом одновременно можно указывать несколько стандартов сразу (например, С11 и POSIX)[6].
Помимо стандарта можно указать целевую платформу для более точного определения ошибок. Каждая платформа определяет размеры базовых типов данных и специфичные для платформы типы данных[2]. Среди доступных можно указать UNIX-подобную операционную систему либо операционную систему Windows разрядностью 32 или 64 бита[6].
Особенности статического анализа
Перед выполнением статического анализа исходный код преобразуется в представление, удобное для дальнейшего анализа. Программа удаляет все комментарии, подставляет вместо макросов их определения, заменяет все переопределения типов на оригинальные типы данных, приводит код к единому стилю оформления. Если значения переменных известны, то вместо названий переменных подставляются их значения. К названиям переменных добавляются их уникальные идентификаторы в рамках программы, что упрощает дальнейший анализ использования переменных. Например, int a;
может быть заменено на int a@1;
, если переменная объявлена первой в программе. Также производятся и другие упрощения кода, предназначенные для облегчения анализа. Следующим этапом идёт проверка кода согласно загруженным в программу правилам, которые сопоставляют код с шаблонами критических и стилевых ошибок. Самые простые правила могут основываться на использовании регулярных выражений[7].
Поскольку реального исполнения кода не происходит, то выдаваемые анализатором сообщения об ошибках могут в действительности указывать на корректно написанный код, что называют ложными срабатываниями. Также возможны ситуации, когда найденная ошибка никогда не сможет проявиться при исполнении кода.
Использование
Работа с Cppcheck производится из командной строки. Начиная с версии 1.33, также доступен кроссплатформенный графический интерфейс, написанный на Qt[8].
Для анализа одного или нескольких исходных файлов достаточно запустить программу cppcheck, передав ей в качестве аргументов пути к проверяемым файлам. Если вместо имени файла указать каталог, программа будет осуществлять рекурсивный обход каталога и анализировать все компилируемые файлы в нём[2].
Пример запуска анализа нескольких файлов и каталога на 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.
Интеграция с инструментами разработки
Поддерживает интеграцию с различными инструментами разработки[9]:
- Clion (плагин cppcheck Архивная копия от 4 августа 2016 на Wayback Machine);
- Code::Blocks (плагин CppCheck Архивная копия от 19 января 2016 на Wayback Machine);
- CodeDX[10];
- CodeLite (плагин CppCheck);
- CppDepend 5[11];
- Eclipse (плагин Cppcheclipse Архивная копия от 10 апреля 2016 на Wayback Machine);
- Jenkins (плагин Cppcheck Архивная копия от 27 января 2016 на Wayback Machine);
- Mercurial (через скрипты на Linux) — проверяет на наличие новых ошибок при создании коммита;
- TortoiseSVN — выполнение скрипта перед созданием коммита[12];
- Git (через скрипты на Linux Архивная копия от 24 декабря 2015 на Wayback Machine) — проверяет файлы, добавляемые в коммит, на наличие ошибок;
- Visual Studio (плагин cppcheck-vs-addin Архивная копия от 11 сентября 2020 на Wayback Machine);
- Qt Creator (плагин QtcCppheck Архивная копия от 7 января 2017 на Wayback Machine).
См. также
- Динамический анализ кода
- Valgrind (динамический анализатор)
Примечания
- ↑ Cppcheck - A tool for static C/C++ code analysis . cppcheck.sourceforge.net. Дата обращения: 21 января 2016. Архивировано 18 января 2016 года.
- ↑ 2,0 2,1 2,2 2,3 Мануал по 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 года.
- ↑ 6,0 6,1 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 (рус.)