Команда PVS-Studio пишет статьи на разные темы. Но мы редко делаем статьи о том, как взаимодействовать с анализатором. Исправим это статьей о плагине PVS-Studio для среды Visual Studio 2022.

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

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

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

Существует множество платных и бесплатных статических анализаторов кода. Их список доступен в Википедии: Список инструментов для статического анализа кода. Список языков, доступных для статического анализа кода, тоже велик — C, C++, C#, Java, Ada, Fortran, Perl, Ruby и др. Разумеется, в этой статье речь пойдет только об анализаторе PVS-Studio.

Основное преимущество статического анализа — это снижение стоимости исправления программных дефектов. Чем раньше будет обнаружена ошибка, тем ниже стоимость ее исправления. Стив МакКоннелл в «Code Complete» приводит следующие данные: исправление ошибки на этапе тестирования системы будет стоить в десять раз дороже, чем на этапе построения:

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

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

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

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

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

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

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

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

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

Помимо исключения целых папок, вы можете исключить отдельные файлы. Параметр FileNameMasks может помочь в этом. Подробнее о том, как работать со списками исключений, читайте в документации Настройки: Не проверять файлы.

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

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

Также можно запускать анализ только для определенных проектов и/или файлов, выбранных в обозревателе решений. Для этого после выбора элементов в Solution Explorer щелкните правой кнопкой мыши и выберите Анализировать с помощью PVS-Studio:

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

Работа со списком предупреждений анализатора

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

  • Окно PVS-Studio.
  • Дополнительное меню. Позволяет получить доступ к таким параметрам, как пометка предупреждения как ложная тревога, скрытие сообщений, добавление файлов в исключения. Мы опишем последний ниже.
  • Эта кнопка включает сообщения «что-то пошло не так». Например, когда один из файлов не может быть предварительно обработан.
  • Перейти к предыдущему/следующему предупреждению. Эта кнопка открывает соответствующий файл, а курсор ставится на предупреждение о возможной ошибке. Вы также можете дважды щелкнуть, чтобы выбрать диагностику из списка. Вы можете назначить сочетания клавиш для перехода к предыдущему/следующему предупреждению. По умолчанию это Alt+’[‘ и Alt+’]’.
  • Кнопки, которые включают предупреждения на разных уровнях. На рисунке видно, что все уровни диагностики включены. Окно показывает 312 предупреждений на первом уровне, 1354 предупреждения на втором уровне и 1405 предупреждений на третьем уровне. Уровень предупреждения отображается в левой части окна в виде строки соответствующего цвета.
  • Активные наборы диагностических правил. Общая — общая диагностика. Оптимизация — микрооптимизация. 64-bit — 64-битная диагностика, OWASP — предупреждения стандарта OWASP ASVS или относящиеся к OWASP Top 10. Теперь в окне отображаются не все наборы диагностик.
  • Эта кнопка показывает количество ложных срабатываний. Включить/отключить отображение отмеченных предупреждений можно в настройках: Расширения › PVS-Studio › Параметры… › Особые настройки анализатора › Отображать ложные тревоги.
  • Быстрые фильтры. Можно, например, оставить в проекте XYZ только диагностику V501.
  • Некоторые диагностики предлагают учитывать не одну, а несколько строк, которые могут находиться в разных файлах. В этом случае рядом с именем файла появляются три точки. Если вы нажмете на нее, вы можете увидеть список строк в файлах и выбрать одну. Когда вы дважды щелкните элемент списка, вы перейдете к этой строке в файле.

Таблица с предупреждениями анализатора имеет следующие столбцы:

  • Уровень. Это уровень уверенности в том, что обнаружена ошибка. 1-й уровень (красный) — самые подозрительные места. 3 уровень (желтый) — скорее всего незначительная неточность в коде;
  • Пометить. У него нет конкретной цели. Пользователи могут интерпретировать его по своему усмотрению. Например, они могут пометить наиболее интересные предупреждения для дальнейшего анализа. Это похоже на пометку писем звездочками в почтовых программах, таких как Thunderbird или Outlook.
  • Идентификатор. Уникальный номер предупреждения. Это может быть полезно, когда вы работаете с длинным списком. Например, можно перейти к предупреждению с определенным названием (см. пункт Перейти к ID… в выпадающем меню). Вы можете отключить этот столбец с помощью контекстного меню.
  • Код. Код предупреждения. Если вы нажмете на нее, откроется страница с описанием предупреждения.
  • CWE. Позволяет идентифицировать предупреждение по CWE ID (Common Weakness Enumeration). Если вы нажмете на ссылку, вы сможете просмотреть это описание CWE в Интернете. Вы можете отключить этот столбец с помощью контекстного меню.
  • SAST. Те же функции, что и выше, но для стандартов MISRA, AUTOSAR, SEI CERT или OWASP. Вы можете отключить этот столбец с помощью контекстного меню.
  • Сообщение. Текст предупреждения анализатора.
  • Проект. Название проекта. Вы можете отключить этот столбец с помощью контекстного меню.
  • Файл. Имя файла. Примечание! После некоторых имен файлов есть точки. Например: «ИмяФайла.cpp(…)». Нажмите на ячейку таблицы с именем файла, и вы получите список всех строк кода (эти строки могут быть в разных файлах), которые относятся к этому предупреждению. При этом возможен переход на каждую из строк списка.
  • Линия. Номер строки, на которую было выдано предупреждение.
  • FA. Это указывает на то, что предупреждение анализатора помечено как ложноположительное.

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

Отображение лучших предупреждений Analyzer

При первом запуске анализатора результат может напугать и/или смутить разработчика — отчет анализатора может содержать огромное количество предупреждений о потенциальных ошибках и уязвимостях. Мы учли этот сценарий и добавили в плагин для Visual Studio механизм Best Warnings. Кнопка включения/отключения этого механизма находится в меню Дополнительные действия:

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

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

Выпадающее меню

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

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

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

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

Обратите внимание на пункт «Не проверять файлы и скрывать все сообщения от…». Если вы нажмете на него, он отобразит список путей, которые можно добавить в исключения.

Вы можете выбрать один файл или весь каталог. На картинке видно, что мы выбрали папку «Sources\Sandbox.Game\Game\Entities». Это означает, что все файлы в этой папке и ее подпапках исключаются из анализа. Более того, все сообщения, связанные с этими файлами, сразу исчезнут из списка. Вам не нужно перезапускать анализ, чтобы удалить все сообщения, связанные с тестовыми файлами.

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

Эта статья была бы неполной, если бы мы не рассказали вам о инкрементальном анализе.

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

При обнаружении ошибки появляется уведомление и предупреждает разработчика.

Если нажать на уведомление или иконку, откроется IDE с результатом анализа, и вы сможете проверить подозрительные фрагменты кода.

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

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

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

Конечно, самое интересное еще впереди. Анализатор PVS-Studio может быть гораздо полезнее. Вот отзыв о нашем анализаторе: Опыт пользователя от работы с анализатором. Прочтите, это стоит вашего времени.

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

Межмодульный анализ

Анализатор PVS-Studio для C# построен на Roslyn API, выполняющем межмодульный анализ проектов. Немного сложнее с межмодульным анализом проектов на C++. Поэтому мы только недавно реализовали эту возможность в PVS-Studio. Межмодульный анализ позволяет анализатору собирать информацию обо всем проекте, а не о каждом отдельном файле. Это позволяет повысить качество и точность анализа. Более подробно об особенностях межмодульного анализа проектов C++ в PVS-Studio можно прочитать в статье «Межмодульный анализ проектов C++ в PVS-Studio.».

Правила диагностики PVS-Studio

Будем честны. Кратко описать всю диагностику в нашем анализаторе невозможно. Полный список диагностик и их описание вы можете найти по ссылке: Сообщения PVS-Studio. В этой статье мы покажем вам таблицу, в которой диагностики сгруппированы по типам. Некоторые диагностики принадлежат более чем к одной группе. Группировка очень условна. Например, опечатка может привести к использованию неинициализированной памяти. Некоторые ошибки были исключены из этого списка — они слишком специфичны. Тем не менее, эта таблица демонстрирует возможности PVS-Studio. Примечание: таблица слишком длинная, поэтому вот небольшой скриншот. Если вы хотите увидеть всю таблицу, перейдите по ссылке выше или просто нажмите на картинку.

Как видите, анализатор показывает всю свою мощь при поиске опечаток и копипасте. Это хорошо для поиска проблем, связанных с безопасностью кода.

Если вы хотите увидеть, как это работает на реальных проектах, посетите страницу База данных ошибок. В этой базе есть ошибки, которые мы обнаружили при проверке проектов с открытым исходным кодом.

САСТ

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

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

Вы можете включить отображение кодов CWE/SAST, воспользовавшись контекстным меню и пройдя по этому пути: Показать столбцы › CWE/SAST.

Как вариант, вы можете включить его в меню (Расширения › PVS-Studio › Отображать коды CWE в окне вывода / Отображать коды SAST в окне вывода)

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

Вы можете прочитать больше об этом здесь".

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

Вы также можете запустить анализатор PVS-Studio из командной строки. Для этого используйте утилиту PVS-Studio-Cmd.exe. Подробную информацию об утилите и ее параметрах можно найти в документации.

Вот как выглядит эта утилита:

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

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

Подавление ложных срабатываний

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

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

  • "тонкая настройка";
  • грубый метод, позволяющий работать только с предупреждениями, относящимися к новому или измененному коду.

Заключение

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

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

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

Дополнительные ссылки