Cppcheck как пользоваться windows

Обновлено: 06.07.2024

Программа статического анализа C/C++ кода. Вместо синтаксических ошибока, она нацелена на такие виды ошибок, которые компиляторы обычно не обнаруживают.

cppcheck . 2> cppcheck.log

  • Рекурсивно проверяет заданный каталог без отображения прогресса выполения:
  • Проверяет файл, выполняя заданные проверки (по-умолчанию ищутся только ошибки - error):
  • Выводит список доступных тестов, отобранных по заданному шаблону:
  • Проверяет текущую папку, задав пути к заголовочным файлам, хранящимся отдельно (например, внешние библиотеки):
  • Проверяет проект ( *.vcxproj ) или решение ( *.sln ) Microsoft Visual Studio:

Копирует файлы в архив/из архива. Поддерживает следующие форматы архивов: двоичный…

crontab

Планировщик cron для запуска задач с заданными интервалом времени от…

Как получить дерево директорий на Bash одним однострочником

Фото Как установить PostgreSQL на Linux и создать базу и пользователя

Как установить PostgreSQL на Linux и создать базу и пользователя

PostgreSQL - система управления базой данных общего назначения. Одна из самых распространённых баз данных, используемая на многих коммерческих и некоммерческих проектах.

Фото Как скопировать вывод команды из терминала в буфер обмена Linux и MacOS

Как скопировать вывод команды из терминала в буфер обмена Linux и MacOS

Скорее приятный, чем необходимы "трюк", но возможность использовать возможность скопировать вывод в буфер обмена – действительно круто иной раз выручает.

Фото Как создать неизменяемый файл в Linux / MacOS / FreeBSD

Как создать неизменяемый файл в Linux / MacOS / FreeBSD

Само собой, root может всё (если введёт пару команд), однако, это вполне легальный способ запретить изменение файла.

Фото Как удалить все Docker образы и контейнеры

Как удалить все Docker образы и контейнеры

Не всегда нужно удалять всё, но объяснение данного "рецепта" объяснит как в целом удалять образы и контейнеры.

Фото Bash < потоки ввода > вывода && управляющие конструкции || коротко о главном

Bash < потоки ввода > вывода && управляющие конструкции || коротко о главном

Небольшая заметка о конструкциях Bash, в которых путается большинство новичков. А именно: >, <, &, &&, |, ||

Фото Лучше плохо, но сейчас. Взгляд на пути развития ПО

Лучше плохо, но сейчас. Взгляд на пути развития ПО

Сейчас такие языки как Perl и Ruby чувствуют себя не лучшим образом. Но ещё 10 – 15 лет назад они были на "гребне волны".

Фото Как запустить программу в терминале в фоне, без вывода какого либо текста

Как запустить программу в терминале в фоне, без вывода какого либо текста

Запускаем программу в терминале в фоновом режиме и разбираемся, как и почему это работает в Linux / Unix терминале.

Фото Малоизвестные, но полезные возможности утилиты less

Малоизвестные, но полезные возможности утилиты less

Команда less является одной из самых известных на ряду с cd, cp, mv и т.д. Но используется less зачастую далеко не на всю мощь.

Фото Как синхронизировать локальную Git версию репозитория с серверной

Как синхронизировать локальную Git версию репозитория с серверной

Прибираемся в локальной версии Git – чтобы локальная версия соответствовала удалённой (серверной) версии Git проекта.

Фото Так ли безопасен Linux? Несколько коммитов с уязвимосятми в stable

Так ли безопасен Linux? Несколько коммитов с уязвимосятми в stable

Исследователи сумели пройти code-review с реквестами в ядро Linux, заведомо содержащими добавление уязвимостей.

Фото Microsoft открывает исходники, а её IDE супер-популярна

Microsoft открывает исходники, а её IDE супер-популярна

Решил сложить пару фактов и немного над этим поразмыслить. Реально ли Microsoft "переобулись"?

Фото Пример своей консольной команды в Django проекте

Пример своей консольной команды в Django проекте

Если вы работали с Django проектом, то, скорее всего, запускали команды из консоли (manage.py). В Django есть простой способ писать свои команды для управления проектом.

Фото Как на Bash посчитать число строк в проекте (директории)

Как на Bash посчитать число строк в проекте (директории)

Ниже будет представлен однострочник, решающий данную задачу на Bash + пошаговое описание его работы.

Фото Как на Bash получить файлы, изменённые за сегодняшний день

Как на Bash получить файлы, изменённые за сегодняшний день

Bash имеет огромные возможности по программированию/скриптованию и администрированию операционной системы. Не важно: Linux это, FreeBSD, или MacOS – на Bash можно сделать многое.

Фото Как установить часовой пояс в Linux

Как установить часовой пояс в Linux

В рамках первичной настройки Операционной Системы важно установить и по какому времени вы живёте, ведь при следующем обновлении времени через Интернет ваше время слетит.

Фото Как найти самые большие папки и файлы в Linux

Как найти самые большие папки и файлы в Linux

Когда кончается место на жестком диске, возникает закономерный вопрос: на что же оно было потрачено, какие файлы разрослись больше положенного?

Фото Команда grep – полезные ключи и примеры использования

Команда grep – полезные ключи и примеры использования

У команды "grep" довольно много различных особенностей. особенно, если учесть, что с английского это "решето" – а что может войти в решето , не факт что выйдет!


Россия
  • размер шрифта уменьшить размер шрифтаувеличить размер шрифта
  • Печать
  • Эл. почта
  • Станьте первым комментатором!

Установка Cppcheck в Qt5. Работа над ошибками с помощью статического анализатора кода. Часть 1.

При написании программ, очень часто программисты делают ошибки. Большую часть из них отлавливает компилятор, но некоторые, при беглом осмотре, не являются ошибками, но могут привести к непредсказуемым глюкам и багам, на отлов которых можно потратить очень много времени.

Для, поиска подобных проблем были созданы специальные утилиты - статические анализаторы кода.

Сегодня мы рассмотрим установку и использование статического анализатора кода Cppcheck в среде разработки Qt Creator.

Установка

Скачайте дистрибутив с программой с сайта проекта:

На момент написания статьи — это версия 2.3

Просто ставим всё по умолчанию.

Запускаем Qt Creator и переходим в меню Справка – О модулях

2021-02-01_17-29-50.jpg

Пролистываем вниз, пока не найдем пункт Code Analyzer и ставим галочку напротив Cppcheck (экспериментально)

2021-02-01_17-30-33.jpg

Нажимаем Закрыть и Перезапустить.

После запуска модуль с сppcheck будет активирован

Откройте пункт меню Анализ - Cppcheck

2021-02-01_17-33-44.jpg

Если в поле «Программа» пусто – укажите C:\Program Files\Cppcheck\cppcheck.exe

Установите все галочки.

Выберите cpp и h файлы в своем проекте

2021-02-01_17-47-16.jpg

Анализ проекта

Для анализа возьмем один из моих проектов.

Настроим анализатор и выберем все *.h и .cpp файлы.

После нажатия кнопки анализировать, открывается окно со всеми найденными проблемами:

Щелкнув по любой строке, вы можете открыть описание всех проблем в файле и перейти к проблеме.

2021-02-02_17-49-38.jpg

Заключение

Сегодня мы рассмотрели установку статического анализатора кода Cppcheck и плагина для среды разработки Qt Creator.

Мы скачали и установили саму программу и плагин в среде разработки.

Настроили плагин для проекта и получили предупреждения от Cppcheck.

Function parameter 'xxxxxxxx' should be passed by const reference.

И причины, по которым не стоит передавать аргументы в функцию по значению.

Фонд программирования безопасности - Начало работы ByCppcheck Tool

1, CPPCheck Инструмент Предисловие Описание:

CPPCheck - это статический инструмент анализа для кода C / C ++. Он предоставляет уникальную функцию анализа кода для обнаружения ошибок и сосредоточиться на обнаружении неопределенного поведения и дизайна структуры опасного кода. Инструмент CPPCHECK предназначен для точно обнаружения фактической ошибки в вашем коде (есть небольшие ложные срабатывания). CPPCheck также поддерживает анализ синтаксиса нестандартного языка C / C / C ++ (например, некоторые встроенные проекты) C / C ++.

2, начните использовать CPPCheck в интерфейсе командной строки:

2.1, Статический анализ Программа

Например, есть такая программа тестирования:

Напрямую выполнить CPPCHECK TEST.C

[ , , (img-JUzTKB3N-1590408518175)(file:////tmp/wps-zjc/ksohtml/wpsozDQo6.jpg)]

2.2, статический анализ всех программ в папке

Анализируя все программы в папке нужно только для выполнения dirname cppcheck.

[ , , (img-tbiBgJHB-1590408518177)(file:////tmp/wps-zjc/ksohtml/wpsKMIiQj.jpg )]

[ , , (img-GN2NaWQV-1590408518179)(file:////tmp/wps-zjc/ksohtml/wpsjUuNhx.jpg)]

2.3 Поддержка проекта статического анализа

Инструмент CPPCHECK поддерживает поддержку статического анализа статического анализа исходного кода файла проекта, таких как решение Visual Studio, проект Visual Studio, Completcate базы данных. Вы можете использовать CPPCheck --Project = <файл проекта> к статическому анализу вашего проекта.

[ , , (img-JtIeTB7u-1590408518182)(file:////tmp/wps-zjc/ksohtml/wpsK3BjJK.jpg)]

2.4 Фильтрация статического анализа исходного файла

Инструмент CPPCheck предоставляет исходный файл, который вы не хотите проверять. Вы можете использовать имя файла или имя файла CPPCheck --i, чтобы отфильтровать исходный файл или каталог, который вы не хотите статичным анализом. Когда вы хотите фильтровать несколько раз, есть несколько -i.

l Предупреждение: Откройте для себя некоторые потенциальные кризисы безопасности, дайте вам некоторые советы о том, как расширить безопасность кода.

L стиль: проблемы со стилем кодирования. Например: функция, которая никогда не использовалась; нет кода, переменной и т. Д. Без какого-либо эффекта и т. Д.)

l Портативность: предупреждение о портативности. Например, линия кода имеет разные результаты в различных средах компилятора.

| Информация: Информация о настройке, рекомендуется включить только это во время конфигурации.

Подождите картину ниже.

[ , , (img-VdaG1bVX-1590408518184)(/tmp/1590404804799.jpg)]

4. Как использовать файлы проекта CPPCheck Import в командной строке

4.1CPPCHECK GUI Project Project

Вы можете пройти cppcheck --project=XXX.cppcheck Команда для импорта файлов проекта, создаваемых графическим интерфейсом CPPCheck для статического анализа. Чтобы обеспечить щиту интерфейса командной строки, существуют некоторые функции, которые графический интерфейс CPPCheck не могут использоваться в командной строке. Таким образом, вы можете использовать эти функции, импортируя файлы проекта в графический интерфейс.

4.2Visual Studio Project Project

Вы можете запустить cppcheck --project=XXX.vcxproj Команда для импорта каждого файла проекта или cppcheck --project=XXX.sln Импортируйте непосредственно во все решение для статического анализа.

5. О системной платформе, связанной с платформой


По умолчанию инструмент CPPCHECK настроен с платформой по умолчанию данного устройства. Вы также можете использовать Cppcheck --platform = <Тип> или <Файл> Команда для установки среды платформы, тип типа показан ниже. Файл - ваш файл конфигурации, как показано ниже.

Вы также можете настроить среду платформы, написав файл конфигурации XML.

Видно, что среда на платформе, связанная с платформой, является: тип CHAR - это 8 бит, номер по умолчанию является символом, короткий тип, два байта, int 4 байта и т. Д.

CPPCheck обеспечивает несколько различных ошибок информации о печати: GCC, VS, редактирование и т. Д. Нам нужно только использовать его при печати cppcheck --template=vs(gcc/edit) Я

[ , , (img-7ZeOAzA0-1590408518185)(/tmp/1590407729533.jpg)]

Проектирование и рефакторинг*,
C++*,
Разработка*
В свете множества недавних статей, посвящённых статическому анализу кода на С++, пользователи неоднократно интересовались анализатором cppcheck. Это относительно молодой проект статического анализа с открытым исходным кодом, ориентированный в первую очередь на нахождение реальных ошибок в коде с минимальным количеством ложных срабатываний.

CppCat и cppcheck

Начну со сравнения этих утилит, поскольку данная просьба озвучивалась неоднократно в комментариях. Разработчики CppCat уже самостоятельно провели такое сравнение (с PVS-Studio), но с тех пор утекло много воды, а сравнение не очень объективно, так как PVS-Studio (насколько я понимаю всю замысловатость фразы «Please write us to get a price for PVS-Studio. Please specify interesting license type.») не предназначена для программистов-одиночек. CppCat же, как и cppcheck, доступен каждому (с оговоркой на привязку к VisualStudio определённых версий и лицензию на год).

Сравнить эти анализаторы будет непросто: у меня не имеется под руками ни одной версии Visual Studio под Linux. Поэтому сначала я ограничусь анализом уже проанализированного кода в недавнем обзоре CppCat: натравлю cppcheck на Notepad++, приведу статистику ошибок/предупреждений, которые можно будет сравнить с уже готовым анализом CppCat.

Параллельно пробую поставить в виртуальной машине CppCat. Надо сказать, что после того как Visual Studio 2010 был установлен, инсталлятор недолго думая выдал следующее:


Из-за чего тестирование усложнилось квестом найди-поставь-Visual-Studio-2013-переустанови-IE-11-перезагрузись-обновись, что на виртуалке, не обременённой обновлениями, заняло ровно полдня.

Что в итоге? При открытии проекта Notepad++ Visual Studio гордо завис. Попытка создать новый проект привела к тому, что в анализе CppCat посыпались ошибки о не найденных заголовочных файлах. По сему сравнивать придётся с тем, что имеем в предыдущей статье. Хотя Visual Studio я ставлю практически в первый раз, но эффект «юзабилити» налицо.

Так как cppcheck — проект с открытым исходным кодом, никто не мешает загрузить самую свежую версию из гита и скомпилировать её самостоятельно. Cppcheck предназначен для разработчиков, поэтому компиляция программы из исходного кода не должна вызывать каких-либо проблем:

unzip cppcheck-master.zip
cd cppcheck-master
make

Готово. Я специально взял свежую версию из гита и положил её в отдельную папку — с ней будет проще работать, так как в дальнейшем cppcheck можно сильно улучшить и настроить «под себя».

Тестовая конфигурация: RHEL 6.1, процессор i5-2400 @ 3.10GHz (для оценки времени работы анализатора).

Удобства ради действия будут производится в командной строке — при желании их можно будет повторить (в Linux:). Конечно, cppcheck имеет несколько плагинов для популярных IDE, но сегодня не об этом.

Анализ Notepad++

cppcheck устроен так, что все предупреждения отсортированы по категориям. По умолчанию включён только один вид анализа — error (ошибки). Ошибки нельзя игнорировать, так как если cppcheck выдал error — это место придётся переписывать в 99% случаев. Основной улов cppcheck — утечки памяти и переполнение буфера, а это уже чего-то стоит.

Может возникнуть резонный вопрос — как анализировать notepad++ в операционной системе Linux, если notepad++ использует исключительно WInAPI? Ответ прост — cppcheck на моей памяти единственный анализатор, который не привязан к сборочной среде или операционной системе. Он использует свой лексический анализатор, не требует обязательного присутствия всех заголовочных файлов, лояльно относится к хитросплетениям классов и т. п. Это замечательное свойство позволяет использовать cppcheck где угодно и для чего угодно, чего не скажешь о CppCat (см. квест по установке выше).

Анализ с помощью cppcheck прост до безобразия:

./cppcheck-master/cppcheck -q -j4 npp.6.5.3.src/

Пока проводится простейший анализ «из коробки». Команда определяет два параметра -q («тихий» режим — не выводить прогресс выполнения на экран) и -j4 — многопоточный анализ в 4 потока по количесву ядер процессора.

Результат выполнения предыдущей команды:

[npp.6.5.3.src/PowerEditor/src/tools/ChangeIcon/ChangeIcon.cpp:214]: (error) Mismatching allocation and deallocation: resData
[npp.6.5.3.src/PowerEditor/src/tools/ChangeIcon/ChangeIcon.cpp:216]: (error) Mismatching allocation and deallocation: resData
[npp.6.5.3.src/scintilla/lexers/LexBash.cxx] -> [npp.6.5.3.src/scintilla/lexers/LexBash.cxx:194]: (error) Internal error. Token::Match called with varid 0. Please report this to Cppcheck developers

Время работы — 5 минут. В глаза сразу бросается ошибка "(error) Internal error. Token::Match called with varid 0. Please report this to Cppcheck developers". Это означает, что вместо бага в анализируемой программе нашёлся баг в самом анализаторе:) Сделаем скидку на то, что проект заточен под Win, и cppcheck не подозревает, что означают DWORD, LPTR и т. п. Возможно, в Win он покажет себя иначе.

Реально нашлась всего одна ошибка (с разницей в 2 строчки). Неплохо, возможно, что автор notepad++ сам пользуется cppcheck. Участок кода, который вызвал у cppcheck подозрение:

Это выглядит как ложное срабатывание, хотя исходники, честно говоря, шокируют. UPD: это всё-таки undefined behaviour, массив нужно освобождать с помощью оператора delete [].

Но это ещё не всё. Дело в том, что девизом cppcheck является отсутствие ложных срабатываний, то есть по умолчанию сканер ищет только очень критические ошибки — переполнение буфера, утечки памяти. После того как все ошибки найдены, можно просканировать повторно, включив флаги предупреждений:

./cppcheck-master/cppcheck -q -j4 --enable=performance,portability,warning,style npp.6.5.3.src/ 2> npp.out

Используется параметр --enable, который включает категории проверок:

— performance — проблемы производительности;

— portability — проблемы совместимости;

— warning — предупреждения — подозрительные места программы;

— style — ошибки стиля программирования.

В таком режиме вылавливается львиная доля стилистических/логических ошибок и потенциальных багов (т. е. ошибки, в которых cppcheck «не уверен»). Время сканирования — 5 минут. Результат я сразу отправил в файл, чтобы собрать статистику.

wc -l < npp.out
379

Небольшая статистика по типу найденных ошибок:

Море переменных не инициализировано в конструкторе: (warning) Member variable % is not initialized in the constructor. Это ошибку cppcheck считает предупреждением. Возможно, поведение такого кода зависит от компилятора, потому что npp каким-то чудом работает.

void init(HINSTANCE hInst, HWND hPere, ScintillaEditView **ppEditView) DockingDlgInterface::init(hInst, hPere);
_ppEditView = ppEditView;
>;

virtual void display(bool toShow = true) const DockingDlgInterface::display(toShow);
>;

void setParent(HWND parent2set) _hParent = parent2set;
>;

void switchEncoding();
void insertChar(unsigned char char2insert) const;

protected:
virtual BOOL CALLBACK AnsiCharPanel::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam);

private:
ScintillaEditView **_ppEditView;
ListView _listView;
>;

Инициализация переменной не в конструкторе, а в функции init, так что на мой взгляд ворнинги по делу.

while (closeFound.success && (styleAt == SCE_H_DOUBLESTRING || styleAt == SCE_H_SINGLESTRING) && searchStartPoint <= caret);

А это — новая добыча cppcheck:

int lineIndent = lineStart;
.
lineIndent = _pEditView->execute(SCI_GETLINEINDENTPOSITION, i);
_pEditView->getGenericText(linebuf, linebufferSize, lineIndent, lineEnd);

Это предупреждение обычно бесполезно — редко, когда в данном участке кода есть ошибка, просто при рефакторинге забыли удалить старое значение.

virtual BOOL CALLBACK FunctionListPanel::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam);

(style) Exception should be caught by reference. Интересное предупреждение — ловить исключение следует по ссылке, а не по значению:

catch(std::exception e) ::MessageBoxA(NULL, e.what(), "Exception", MB_OK);
return -1;
>

(style) Consecutive return, break, continue, goto or throw statements are unnecessary. Мёртвый код: break после return:

switch(lpnm->wID) case REBAR_BAR_TOOLBAR: .
return TRUE;
break; >
>

(warning) Assignment of function parameter has no effect outside the function. Обычно это полезное предупреждение, сигнализирующее об опечатке — значение, присвоенное внутри функции, никуда не передаётся. Однако здесь это очевидно ложное срабатывание, так как value — переменная класса:

void SetValue( const TCHAR* _value )

(portability) scanf without field width limits can crash with huge input data on some versions of libc. Подобная привычка использования scanf может привести к опасному переполнению буфера. В случае числовых переменных это банальный undefined behaviour:

if ( sscanf( value.c_str(), "%d", ival ) == 1 )

Для преобразования чисел лучше использовать безопасный strtol.

Ещё один представитель:

Здесь нет переполнения буфера только потому, что wordBuffer и sKeywordBuffer одинакового размера.

void operator = (const TiXmlStringA & copy);

С таким оператором нельзя использовать стандартную для C++ цепочку:

class ControlsTab : public TabBar
public :
.
private :
.
bool _isVertical;
>;

которая уже определена в родительском классе:

class TabBar : public Window
.
protected:
.
bool _isVertical;
>;

Не являясь экспертом в плюсах, не могу сразу ответить, можно ли так делать (protected/private).

if(eol_mode == SC_EOL_CRLF)
extraEOLLength = 2;
else if(eol_mode == SC_EOL_LF)
extraEOLLength = 1;
else // SC_EOL_CR
extraEOLLength = 1;

size_t lenFile = 0;
.
if (lenFile <= 0) break;

Думаю, если бы у меня были заголовочные файлы винды, можно указать путь к ним через параметр -I, тогда ошибок будет значительно больше.

Учитывая, что параметр startcol внешний, можно вылететь за границу массива, не говоря об индексе -1.

for(unsigned int i = position_of_click; i >= 0; --i)

Этой ошибки можно было бы избежать при сборке проекта компилятором gcc и флагами -Wall -Wextra. Думаю, такая ошибка часто появляется при рефакторинге проекта по другой ошибке компилятора — несоответствие типов. Было int — стало unsigned, вот и результат.

Мелкие недочёты

(style) Unused variable: ent. Это предупреждение умеют выдавать и компиляторы, ничего интересного.

Класс без конструктора:

class CachedValue
generic_string fullname;
int index;
>;

XYScrollPosition XYScrollToMakeVisible(const SelectionRange range, const XYScrollOptions options);

Оба анализатора наковыряли приличное количество ошибок, причём многие из них уникальны для каждого анализатора. В целом, было бы неплохо иметь cppcheck под рукой всегда, так как он открыт, кроссплатформенный, реально находит ошибки и помогает улучшать стиль программирования. Использование cppcheck обычно не представляет проблем.

Из этого анализа можно сделать вывод, что инструменты хорошо друг друга дополняют. Для кого-то главным минусом cppcheck является отсутствие плагина под Visual Studio, поэтому авторы cppcheck любезно предлагают попробовать PVS-Studio. Несмотря на интерфейс командной строки, пользоваться cppcheck очень удобно. Не требуется ни компилятора, ни IDE, ни заголовочных файлов — это самый простой в использовании статический анализатор, который я только видел. Кроме того, я специально поставил в виртуальной машине сборку cppcheck для Windows — она имеет приятный графический интерфейс, устанавливается быстро и без проблем выполняет анализ:


Результат анализа можно экспортировать в XML и смотреть в браузере.

Данный анализ можно было бы сильно улучшить, если явно указать cppcheck, где искать заголовочные файлы, какие функции выделяют и освобождают память. Так как статья получилась большой, про то, как настроить cppcheck под конкретный проект, улучшить качество анализа и писать свои правила для cppcheck — в следующий раз.

P. S. Прошу простить одну глупость. Cppcheck имеет в настройках возможность анализировать код специально для Windows, из-за чего очень много интересных ошибок было пропущено. Нужно было анализировать npp с флагом --platform=win32A.

Читайте также: