Cppcheck

Cppcheck
Логотип программы Cppcheck
Скриншот программы 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]:

См. также

Примечания

  1. Release 2.21.0 — 2026.
  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 года.

Ссылки

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.