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]:
- 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.21.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 (рус.)
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.
- 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:
- 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.
- 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.
- 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.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.