﻿# Знакомство со статическим анализатором PVS\-Studio для Visual C\+\+

В этой статье я хочу познакомить вас с анализатором C и C\+\+ кода PVS\-Studio и как с ним работать в среде Visual C\+\+\. Данная статья будет полезна для начинающих пользователей\.

![0642_PVS-Studio-for-Visual-Cpp_ru/image1.png](https://import.viva64.com/docx/blog/0642_PVS-Studio-for-Visual-Cpp_ru/image1.png)

## Установка анализатора

PVS\-Studio поддерживает среды Microsoft Visual Studio 2019, 2017, 2015, 2013, 2012, 2010\. Системные требования можно узнать в [документации](https://pvs-studio.ru/ru/docs/manual/0018/)\. На данный момент PVS\-Studio анализирует проекты, написанные на языке C, C\+\+, C\# и Java\. Однако данная заметка посвящена программистам, использующим Visual C\+\+ и желающим впервые познакомиться со статическим анализатором кода PVS\-Studio\.

Скачать установочный пакет можно [по этой ссылке](https://pvs-studio.ru/ru/pvs-studio/download/)\. После запуска пакета будут предложены варианты интеграции \(см\. рисунок 1\)\. Недоступные варианты будут затемнены\.

![0642_PVS-Studio-for-Visual-Cpp_ru/image2.png](https://import.viva64.com/docx/blog/0642_PVS-Studio-for-Visual-Cpp_ru/image2.png)

Рисунок 1\. Окно с компонентами интеграции\.

После установки стоит открыть окно About в Visual Studio и проверить присутствие PVS\-Studio в списке установленных продуктов\.

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

По завершении установки вы можете приступить к проверке проекта\. Также можно сразу попробовать проверить решение целиком\. Для этого выберите пункт меню Extensions \> PVS\-Studio \> Check \> Solution \(см\. рисунок 2\)\.

![0642_PVS-Studio-for-Visual-Cpp_ru/image3.png](https://import.viva64.com/docx/blog/0642_PVS-Studio-for-Visual-Cpp_ru/image3.png)

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

Если с проверкой возникнут какие\-то трудности, мы рекомендуем обратиться к разделу "[Не удается проверить?](https://pvs-studio.ru/ru/docs/manual/0029/)" на нашем сайте\. Это не бестолковые рекомендации в духе "проверьте, что вилка вставлена в розетку"\. В разделе описаны типовые ситуации, с которыми к нам обращались пользователи, и предложены варианты действий\.

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

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

![0642_PVS-Studio-for-Visual-Cpp_ru/image5.png](https://import.viva64.com/docx/blog/0642_PVS-Studio-for-Visual-Cpp_ru/image5.png)

Рисунок 3\. Окно с диагностическими сообщениями\. Нажмите на рисунок для его увеличения\.

Все элементы окна рассмотрены в [документации](https://pvs-studio.ru/ru/docs/manual/0021/), но сейчас мы остановимся на основных:

1. Уровень достоверности предупреждения\. На скриншоте включены средний и высокий уровни\. Низкий уровень относится больше к "Code Smells" и предупреждениям, которые, к сожалению, дают большой процент ложных срабатываний\. Почему так много срабатываний среднего и низкого уровня, но так мало высокого? Дело в том, что были включены MISRA\-диагностики, содержащие правила типа "функция должна иметь одну точку выхода"\. Да, такие диагностики в обычной ситуации несут мало пользы и по умолчанию находятся в выключенном состоянии\. Примечание: "[Как быстро посмотреть интересные предупреждения, которые выдает анализатор PVS\-Studio для C и C\+\+ кода?](https://pvs-studio.ru/ru/blog/posts/cpp/0633/)"\.
1. Фильтр\. Предупреждения можно отфильтровать по коду, CWE, сообщению, проекту или файлу\.
1. Номер строки с ошибкой\. Некоторые диагностики могут выдавать предупреждение на несколько строк, поэтому рядом с ними появляется многоточие\.

## SAST

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

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

1. CWE
1. SEI CERT
1. MISRA

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

![0642_PVS-Studio-for-Visual-Cpp_ru/image6.png](https://import.viva64.com/docx/blog/0642_PVS-Studio-for-Visual-Cpp_ru/image6.png)

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

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

![0642_PVS-Studio-for-Visual-Cpp_ru/image7.png](https://import.viva64.com/docx/blog/0642_PVS-Studio-for-Visual-Cpp_ru/image7.png)

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

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

![0642_PVS-Studio-for-Visual-Cpp_ru/image8.png](https://import.viva64.com/docx/blog/0642_PVS-Studio-for-Visual-Cpp_ru/image8.png)

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

Подробнее про эти классификации можно прочитать [здесь](https://pvs-studio.ru/ru/pvs-studio/sast/)\.

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

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

Программа имеет множество [параметров](https://pvs-studio.ru/ru/docs/manual/0035/), но для начала нам понадобится только три из них:

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

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

![0642_PVS-Studio-for-Visual-Cpp_ru/image9.png](https://import.viva64.com/docx/blog/0642_PVS-Studio-for-Visual-Cpp_ru/image9.png)

Рисунок 7\. Вывод программы PVS\-Studio\_Cmd\.exe

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

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

![0642_PVS-Studio-for-Visual-Cpp_ru/image11.png](https://import.viva64.com/docx/blog/0642_PVS-Studio-for-Visual-Cpp_ru/image11.png)

Рисунок 8\. Открытие отчета из меню плагина\.

Подробную информацию по утилите и ее параметрам можно найти в [документации](https://pvs-studio.ru/ru/docs/manual/0035/)\.

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

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

* [Тонкая настройка](https://pvs-studio.ru/ru/docs/manual/0017/)\.
* [Грубый метод](https://pvs-studio.ru/ru/docs/manual/0032/), позволяющий работать только с предупреждениями, относящимися к новому или изменённому коду\.

## Пример предупреждения

Рассмотрим пример ошибки, выявленной анализатором\. Следующий код был взят из проекта ReactOS:

```cpp
VOID NTAPI
AtapiDmaInit(....)
{
  ....
  ULONG treg = 0x54 + (dev < 3) ? (dev << 1) : 7;
  ....
}
```

Предупреждение PVS\-Studio: V502 Perhaps the '?:' operator works in a different way than it was expected\. The '?:' operator has a lower priority than the '\+' operator\. uniata id\_dma\.cpp 1610

Выражение _0x54 \+ \(dev < 3\)_ будет всегда _true_ \- в первую очередь ненулевая константа _0x54_ суммируется с результатом выражения _\(dev < 3\)_, которое может иметь значение 0 или 1, и уже затем результат сравнивается с нулем\.

Правильный код должен иметь вид:

```cpp
VOID NTAPI
AtapiDmaInit(....)
{
  ....
  ULONG treg = 0x54 + ((dev < 3) ? (dev << 1) : 7);
  ....
}
```

В этом случае мы обернули оператор _'?:'_ в скобки, теперь он будет принимать значение в зависимости от выражения _\(dev < 3\)_\.

## Заключение

Это было краткое введение в то, как работать с PVS\-Studio для Visual C\+\+\. Конечно, тут было рассмотрено далеко не всё\. Более подробно мы разбираем работу анализатора в нашем [блоге](https://pvs-studio.ru/ru/blog/posts/), а описание всех сообщений и настроек есть в [документации](https://pvs-studio.ru/ru/docs/)\.