Cppcheck — статический анализатор кода для языка C/C++, предназначенный для поиска ошибок, которые не обнаруживаются компиляторами. Главной целью проекта является сведение до минимума количества ложных срабатываний при поиске ошибок[2].

Cppcheck
Тип Статический анализатор кода
Написана на C++
Операционная система Unix-подобная операционная система
Первый выпуск 8 мая 2007
Последняя версия
Репозиторий github.com/danmar/cppche…
Лицензия GPLv3
Сайт cppcheck.sourceforge.net

Анализатор способен проверять нестандартные участки кода, включающие использование расширений компилятора, встраиваемый ассемблер и т. п.[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]:

См. также

править

Примечания

править
  1. Release Cppcheck-2.16.0 (англ.) — 2024.
  2. Cppcheck - A tool for static C/C++ code analysis. cppcheck.sourceforge.net. Дата обращения: 21 января 2016. Архивировано 18 января 2016 года.
  3. 1 2 3 4 Мануал по Cppcheck версии 1.75. Дата обращения: 21 января 2016. Архивировано 5 марта 2016 года.
  4. cppcheck / Wiki / ListOfChecks. sourceforge.net. Дата обращения: 21 января 2016. Архивировано 26 декабря 2015 года.
  5. danmar/cppcheck - rules (англ.). GitHub. Дата обращения: 21 января 2016. Архивировано 24 декабря 2015 года.
  6. danmar/cppcheck - add ons (англ.). GitHub. Дата обращения: 21 января 2016. Архивировано 24 декабря 2015 года.
  7. 1 2 Ubuntu Manpage: cppcheck - Tool for static C/C++ code analysis (англ.). manpages.ubuntu.com. Дата обращения: 31 января 2016. Архивировано 25 апреля 2016 года.
  8. Daniel Marjamäki. Writing Cppcheck rules. Part 2 - The Cppcheck data representation (англ.) : сайт. — 2010. Архивировано 13 марта 2016 года.
  9. cppcheck / News: cppcheck-1.33. sourceforge.net. Дата обращения: 8 марта 2016. Архивировано 14 марта 2016 года.
  10. cppcheck / Wiki / Home. sourceforge.net. Дата обращения: 21 января 2016. Архивировано 27 декабря 2015 года.
  11. FAQ - (англ.). codedx.com. Дата обращения: 31 января 2016. Архивировано 31 января 2016 года.
  12. CoderGears, https://www.codergears.com/home. CppDepend :: Achieve higher C/C++ code quality. www.cppdepend.com. Дата обращения: 31 января 2016. Архивировано 17 февраля 2016 года.
  13. Automatic static code analysis before uploading your code. Omerez. Дата обращения: 21 января 2016. Архивировано 21 января 2016 года.

Ссылки

править