Хабрахабр

PVS-Studio для Visual Studio

Многие наши статьи посвящаются чему угодно, но только не самому инструменту PVS-Studio. А ведь мы очень много делаем, чтобы разработчикам было удобно пользоваться нашим инструментом. Но как раз это часто оказывается за кадром. Решил исправить эту ситуацию и рассказать о плагине PVS-Studio для Visual Studio. Если вы используете Visual Studio, то эта статья для вас.

Что такое статический анализ кода и зачем он нужен

Статический анализ кода — это процесс выявления ошибок и недочетов в исходном коде программ. Статический анализ можно рассматривать как автоматизированный процесс обзора кода. Совместный обзор кода — замечательная методология. Но у неё есть и существенный недостаток — высокая стоимость. Необходимо регулярно собирать нескольких программистов для обзора нового кода или повторного обзора кода после внесения рекомендаций.

С другой — это слишком дорого. С одной стороны, хочется регулярно осуществлять обзор кода. Они без устали обрабатывают исходные тексты программ и выдают программисту рекомендации обратить повышенное внимание на определенные участки кода. Компромиссным решением являются инструменты статического анализа кода. Однако, соотношение польза/цена делает использование статического анализа весьма полезной практикой, применяемой многими компаниями. Конечно, программа не заменит полноценного обзора кода, выполняемого коллективом программистов. Если читателя интересуют конкретные числа, то предлагаю познакомиться со статьёй "PVS-Studio ROI".

Большой список статических анализаторов имеется на сайте Wikipedia: List of tools for static code analysis. Существует большое количество коммерческих и бесплатных статических анализаторов кода. Естественно, мы будем рассказывать вам об анализаторе PVS-Studio. Список языков, для которых существуют статические анализаторы кода, также достаточно велик (Си, Си++, C#, Java, Ada, Fortran, Perl, Ruby, ...).

Чем раньше ошибка выявлена, тем меньше стоимость ее исправления. Главное преимущество статического анализа состоит в возможности существенного снижения стоимости устранения дефектов в программе. Так согласно данным, приведенным в книге Макконнелла «Совершенный Код», исправление ошибки на этапе тестирования обойдется в десять раз дороже, чем на этапе конструирования (написания кода):

Рисунок 1. Средняя стоимость исправления дефектов в зависимости от времени их внесения и обнаружения (данные для таблицы взяты из книги С. Макконнелла "Совершенный Код").

Рисунок 1. Средняя стоимость исправления дефектов в зависимости от времени их внесения и обнаружения (данные для таблицы взяты из книги С. Макконнелла «Совершенный Код»).

Например, статический анализатор кода PVS-Studio может запускаться в фоновом режиме сразу после компиляции и, в случае нахождения потенциальной ошибки, уведомит программиста. Инструменты статического анализа позволяют выявить большое количество ошибок этапа конструирования, что существенно снижает стоимость разработки всего проекта. Подробнее об этом режиме будет рассказано ниже.

Статический анализатор кода PVS-Studio

PVS-Studio — статический анализатор, выявляющий ошибки и потенциальные уязвимости в исходном коде приложений на языках C, C++ (также поддерживаются расширения: C++/CLI и C++/CX), C# и Java на платформах Windows, Linux и macOS. Анализатор великолепно интегрируется в среды Visual Studio 2010 — 2019 и IntelliJ IDEA. В этой статье мы подробно рассмотрим работу PVS-Studio для проверки кода на языках C, C++ и C#. Про то, как использовать PVS-Studio для проверки Java кода в IntelliJ IDEA, можно почитать здесь.

рисунок 2). После установки PVS-Studio и интеграции в Visual Studio, пользователи получают дополнительный пункт «PVS-Studio» в главном меню и окно для работы с диагностическими сообщениями (см.

Рисунок 2. Основные элементы, добавляемые анализатором PVS-Studio при интеграции в Visual Studio.

Рисунок 2. Основные элементы, добавляемые анализатором PVS-Studio при интеграции в Visual Studio.

Начальные настройки

Анализатор готов к работе сразу после установки. В большинстве случаев вам не потребуется ничего настраивать, чтобы осуществить первый запуск. Единственная настройка, которая может понадобиться вам в начале, это исключение сторонних библиотек. Вы ведь все равно не будете ничего править в исходных файлах, например, библиотеки jpeg, поэтому незачем её проверять. Вдобавок, исключение лишних папок сократит время анализа проекта. Исключаемые из анализа директории задаются здесь: PVS-Studio > Options… > Don't Check Files > PathMasks (см. рисунок 3).

Рисунок 3. Редактирование списка директорий, которые анализатор не будет проверять.

Рисунок 3. Редактирование списка директорий, которые анализатор не будет проверять.

По умолчанию, в список уже включены имена некоторых директорий. Если в полном пути файла есть одно из указанных имён, то анализ выполняться не будет. Поэтому следует отредактировать этот список. Однако, в вашем проекте папка с библиотекой ZLib может называться не «zlib», а, например, «zip_lib». Для начала редактирования следует нажать кнопку с тремя точками.

Примеры допустимых масок для списка PathMasks:

  • c:\Libs\ — будут исключены все файлы проекта, расположенные в данной папке и её подпапках.
  • \Libs\ или *\Libs\* — будут исключены все файлы, расположенные в директориях, путь до которых содержит подпапку «Libs». Если символы "*" не указаны, они все равно будет автоматически добавлены, поэтому оба варианта записи одинаковы.
  • Libs или *Libs* — исключены будут все файлы, путь до которых содержит подпапку, имеющую 'Libs' в качестве имени либо фрагмента имени. Также в этом случае будут исключены файлы, содержащие Libs в имени, например, c:\project\mylibs.cpp. Для избегания путаницы рекомендуем всегда использовать слеши.

Помимо исключений целых папок, можно задавать маски для исключения отдельных файлов. Для этого существует настройка FileNameMasks. Подробнее, как работать со списками исключения можно познакомиться в документации: Settings: Don't Check Files.

Проверка проекта

По завершению первичных настроек, вы можете приступить к проверке проекта. PVS-Studio для Visual Studio поддерживает проверку C++ (.vcxproj) и C# (.csproj) проектов. Также можно сразу попробовать проверить решение, содержащее проекты таких типов, целиком. Для этого выберите пункт меню Extensions > PVS-Studio > Check > Solution (см. рисунок 4).

Рисунок 4. Проверка решения (Solution) с помощью анализатора PVS-Studio.

Рисунок 4. Проверка решения (Solution) с помощью анализатора PVS-Studio.

Это не бестолковые рекомендации в духе «проверьте, что вилка вставлена в розетку». Если с проверкой возникнут какие-то трудности, мы рекомендуем обратиться к разделу "Не удается проверить?" на нашем сайте. В разделе описаны типовые ситуации, с которыми к нам обращались пользователи, и предложены варианты действий.

Работа со списком диагностических сообщений

После проверки все диагностические сообщения будут отображены в специальном окне. Окно имеет много элементов для управления. Все они служат для того, чтобы показать именно те диагностические сообщения, которые интересны пользователю. Однако, в первый момент окно может показаться сложным. Давайте рассмотрим все управляющие элементы (см. рисунок 5).

Рисунок 5. Окно с диагностическими сообщениями.

Рисунок 5. Окно с диагностическими сообщениями.

  1. Собственно, окно PVS-Studio.
  2. Дополнительное меню. Позволяет получить доступ к таким опциям, как: пометка предупреждения как ложного, скрытие сообщений, добавление файлов в исключения (об этом ниже).
  3. Кнопка включает сообщения «что-то пошло не так». Например, не удается препроцессировать один из файлов.
  4. Переход к предыдущему/следующему сообщению. При этом открывается соответствующий файл, и курсор ставится на строку с потенциальной ошибкой. Также всегда можно выбрать диагностику из списка с помощью двойного щелчка мышью. Можно назначить горячие клавиши для осуществления переходов к предыдущему/следующему сообщению. По умолчанию это Alt+'[' и Alt+']'.
  5. Кнопки, включающие предупреждения разных уровней. Сейчас включены два первых уровня диагностик. При этом в окне показывается 90 предупреждений первого уровня, 6700 предупреждение второго уровня. Уровень сообщения показывается в левой части окна, в виде полоски, соответствующей по цвету полоске на кнопке соответствующего уровня. Почему так много срабатываний? Откуда 6700 предупреждений? Для демонстрации возможностей интерфейса включен набор правил MISRA, что делать для обыкновенных прикладных программ противопоказано :).
  6. Активные наборы диагностических правил. General — диагностики общего назначения, Optimization — микрооптимизации, 64-bit — 64-битные диагностики, MISRA — диагностики стандартов MISRA C и MISRA C++. Сейчас в окне отображаются все виды предупреждений.
  7. Показывает количество сообщений, помеченных как ложные (False Alarms). Включить/выключить отображение размеченных сообщений можно в настройках, PVS-Studio > Options… > Specific Analyzer Settings > Display False Alarms.
  8. Быстрые фильтры. Можно, например, оставить в списке только сообщения с кодом V501 и, находящиеся в проекте XYZ.
  9. Некоторые диагностики предлагают обратить внимание не на одну, а несколько строк. В этом случае, рядом с номером строки появляется многоточие. Кликнув по нему мышкой, можно увидеть список строк и выбрать одну из них.

Таблица с диагностическими сообщениями разбита на следующие колонки:

  • Уровень. Уровень достоверности, что найдена именно ошибка. 1-й уровень (красный) — наиболее подозрительные места. 3-й (желтый) уровень — скорее всего несущественная неточность в коде.
  • Звездочка. У неё нет конкретного назначения. Пользователь может интерпретировать её по своему усмотрению. Например, он может отметить наиболее интересные предупреждения для дальнейшего внимательного анализа. Аналогия — отметка звездочками писем в почтовой программе типа Thunderbird или Outlook.
  • ID. Уникальный номер сообщения. Может пригодиться при работе с большим списком. Например, можно перейти к сообщению с определенным номером (см. пункт «Navigate to ID...» в контекстном меню).
  • Code. Код сообщения. Если щелкнуть по нему мышкой, то откроется страница с описанием предупреждения.
  • CWE. Позволяет идентифицировать предупреждение по коду CWE (Common Weakness Enumeration). При нажатии на ссылку можно посмотреть описание данного CWE в сети.
  • MISRA. То же, что и выше, но только для стандарта MISRA.
  • Message. Текст диагностического сообщения.
  • Project. Имя проекта (можно отключить эту колонку, используя контекстное меню).
  • File. Имя файла.
  • Line. Номер строки. Важно! Обратите внимание, что после некоторых строк стоит многоточие. Пример: «123 (...)». Кликнув на это число, вы получите список всех строк кода, которые относятся к этому сообщению. При этом есть возможность перейти к каждой из строк в списке.

Да, прочитать всё это было утомительно. Однако, уверяю вас, начав пользоваться, вы быстро освоитесь с инструментом. И нажимать что-то для настройки будете крайне редко.

Контекстное меню

Итак, по двойному клику мышки на сообщении вы переходите к нужному фрагменту кода. По нажатию правой кнопки мышки открывается контекстное меню.

Если что-то непонятно, можно подсмотреть в документации. Меню достаточно простое, и не стоит перегружать статью описанием каждого из пунктов.

Помните, что в настройках можно добавить папки/файлы для исключения (см. Однако, хочу остановиться на одной очень полезной фиче. Так вот, добавлять что-то намного проще, чем кажется! рисунок 2).

При нажатии на него выпадает список путей, которые можно добавить в исключение (см. Обратите внимание на пункт «Don't check files and hide all messages from...». рисунок 6).

Исключение файлов из проверки."/> <img src="https://habrastorage.org/getpro/habr/post_images/ce3/581/300/ce35813002196bdbd53fcb666a33f58b.png" alt="Рисунок 6.

Рисунок 6. Исключение файлов из проверки.

На рисунке показано, что выбирается папка «SDL2-2. Можно выбрать как отдельный файл, так и одну из директорий. 9\src\haptic\windows». 0. Более того, все сообщения, относящиеся к этим файлам, сразу исчезнут из списка. Это значит, что все файлы в этой папке и всех подпапках будут исключены из анализа. Не нужно перезапускать анализ, чтобы убрать все сообщения, относящиеся к тестам. Очень удобно.

Режим инкрементального анализа

Введение в PVS-Studio будет неполным, если не рассказать об одной из важнейших возможностей — инкрементальном анализе кода.

Идеально сразу подчеркивать ошибки в редактируемом тексте программы. Чем раньше ошибка найдена, тем дешевле её устранение. Поэтому PVS-Studio запускается в фоновом режиме в тот момент, когда исправленный код успешно скомпилирован. Однако, это технически сложно и ресурсоемко. О том, что происходит анализ, можно судить по иконке в системной области уведомлений. Таким образом, ищутся ошибки в только что измененном коде.

рисунок 7). Когда ошибка найдена, появляется всплывающее окошко, предупреждающее об опасности (см.

Рисунок 7. Всплывающее сообщение, что найдены подозрительные места в отредактированных файлах.

Рисунок 7. Всплывающее сообщение, что найдены подозрительные места в отредактированных файлах.

рисунок 2) и можно будет изучить подозрительный фрагменты кода. Если кликнуть мышкой на иконку, то откроется IDE с результатом проверки проекта (см.

Вы пишите код, как и раньше. На самом деле, чем описывать этот режим, проще попробовать поработать с ним. Попробуйте! А если надо, анализатор потревожит вас.

Да, мы тоже иногда допускаем ошибки при кодировании. Мы сами постоянно используем этот режим. Очень обидно потратить минут 15-20 на отладку, чтобы потом обнаружить опечатку в индексе. И возможность их сразу исправить существенно сокращает время на обнаружение дефекта и попытку понять, отчего программа ведёт себя не так, как планировалось. Вот один из случаев, когда PVS-Studio нашел ошибку в PVS-Studio сразу после того, как она появилась в коде:

if (in[0] == '\\' && in[1] == '.' && in[1] == '\\')
{ in += 2; continue;
}

Но это, конечно, цветочки. Анализатор PVS-Studio иногда может оказаться намного полезнее. Вот один из отзывов о нашем анализаторе: "Пример использования статического анализатора". Текст заставляет задуматься.

Инкрементальный анализ — это то, что вы должны обязательно попробовать. Резюмирую. Вы его полюбите, как только найдете пару ляпов в свежем коде.

Возможности PVS-Studio

Будем кратки. Невозможно лаконично описать все диагностики, которые имеются в PVS-Studio. Полный список диагностик и их подробное описание можно найти в документации: Описание диагностируемых ошибок. Ограничимся таблицей, в которой диагностики сгруппированы по типам. Некоторые диагностики входят более, чем в одну группу. Дело в том, что деление весьма условно. Например, опечатка может приводить к использованию неинициализированной памяти. Некоторым ошибкам наоборот места в таблице не нашлось, слишком они специфические. Тем не менее, таблица в целом дает представление о функциональности статического анализатора кода (см. рисунок 8).

Рисунок 8. Возможности PVS-Studio.

Рисунок 8. Возможности PVS-Studio.

Хорошо диагностирует проблемы, которые связаны с безопасностью кода. Как видите, анализатор максимально проявляет себя в таких областях, как поиск ошибок, возникших из-за опечаток, Copy-Paste.

Мы собираем в эту базу все ошибки, которые нашли, проверяя различные Open-Source проекты. Как всё это работает на практике, можно узнать, заглянув в базу ошибок.

SAST

PVS-Studio является средством статического тестирования защищённости приложений (Static Application Security Testing, SAST) — анализатор может выявлять потенциальные уязвимости в коде проекта и показывать соответствующий идентификатор ошибки в определенной классификации.

PVS-Studio поддерживает следующие классификации ошибок:

  1. CWE
  2. SEI CERT
  3. MISRA

Включить отображение кодов CWE можно по контекстному меню в окне анализатора по пути Show Columns > CWE

Рисунок 9. Контекстное меню и пример вывода CWE-кодов.

Рисунок 9. Контекстное меню и пример вывода CWE-кодов.

Либо в меню сверху (Extensions > PVS-Studio > Display CWE Codes in Output Window)

Рисунок 10. Меню расширения.

Рисунок 10. Меню расширения.

Диагностики MISRA включаются отдельно в настройках:

Рисунок 11. Список определяемых ошибок.

Рисунок 11. Список определяемых ошибок.

Подробнее про эти классификации можно прочитать здесь.

Проверка проектов из командной строки

PVS-Studio_Cmd.exe — утилита для проверки C++/C# Visual Studio проектов (.vcxproj/.csproj) и решений .sln из командной строки. Она может быть полезна для автоматизации анализа. Программа находится в директории, куда была произведена установка — по умолчанию это 'C:\Program Files (x86)\PVS-Studio'.

Программа имеет множество параметров, но для начала нам понадобится только 3 из них:

  • --target: файл проекта или решения, который требуется проверить.
  • --output: plog-файл, куда требуется записать отчет.
  • --progress: показывать прогресс проверки.

Вот так будет выглядеть запуск:

Рисунок 12. Вывод программы PVS-Studio_Cmd.exe

Рисунок 12. Вывод программы PVS-Studio_Cmd.exe

Этот отчет можно преобразовать в другие форматы с помощью утилиты PlogConverter.exe, а для просмотра отчета в IDE достаточно двойного клика по plog-файлу в проводнике. После выполнения мы получим plog-файл с отчетом, путь до которого мы указали в параметрах запуска.

Также файл отчета можно открыть в меню расширения по пути Extensions > PVS-Studio > Open/Save > Open Analysis Report…

Picture 4

Подробную информацию по утилите и ее параметрам можно найти в документации.

Подавление ложных предупреждений

Некоторые сообщения, выданные анализатором, неизбежно будут ложными. С этим ничего нельзя поделать. Статический анализатор это всего лишь программа, которая не обладает искусственным интеллектом и не может точно определить, нашла она настоящую ошибку или нет.

Подробно они описаны в следующих разделах документации: Для борьбы с ложными срабатываниями в анализаторе предусмотрен набор различных механизмов.

Заключение

Конечно, здесь мы рассказали не всё об инструменте. Если рассказывать всё, то статья превратится в документацию. Цель была показать, как легко можно работать с инструментом в рамках среды Visual Studio. Про другие среды и режимы работы можно почитать в документации и других статьях, расположенных на нашем сайте. Там, кстати, много интересного для программистов. Заходите побродить.

Мы также поддерживаем язык Java, можем работать под Linux и macOS, интегрироваться в CMake и много чего еще. Cтоит отметить, что PVS-Studio работает не только в среде от Microsoft. Подробнее можно узнать в документации.

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

Дополнительные ресурсы:

  1. Обзор кода (code review).
  2. Статический анализ кода.
  3. Инструменты статического анализа кода.
  4. SAST.
  5. Технологии, используемые в анализаторе PVS-Studio.
  6. Скачать PVS-Studio и попробовать в деле.
  7. Поддержка Visual Studio 2019.
  8. Обсудить цену на анализатор PVS-Studio для вашей команды и способах его приобретения: купить PVS-Studio.
  9. Пример использования статического анализатора.
  10. Ответы на вопросы, которые часто задают на конференциях.
  11. Как запустить PVS-Studio Java
  12. Как запустить PVS-Studio в Linux и macOS

PVS-Studio for Visual Studio Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Sergey Larin.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть