﻿# Практика использования анализатора PVS\-Studio\. Теперь с поддержкой С\#

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

## PVS\-Studio с поддержкой C\#

Начиная с версии PVS\-Studio 6\.00, у разработчиков есть возможность проверить с помощью анализатора PVS\-Studio не только C/С\+\+ код, но и C\# код\. Условия лицензирования остаются прежними \- вы покупаете/продлеваете лицензию PVS\-Studio, но теперь можете использовать PVS\-Studio сразу для 3\-х языков программирования С/C\+\+/C\#\. 

## Сценарий работы разработчика с PVS\-Studio

Часто, впервые проверив свой код с помощью анализатора, разработчик не знает, что делать со всем тем обилием ошибок, которые нашел анализатор\. По проекту приходят новые задачи, а быстро исправить найденные анализатором проблемы не получается\. Разработчик хочет отложить текущие предупреждения анализатора и начать анализировать новый написанный код, чтобы сразу получать подсказки от анализатора о возможных проблемах\. Еще одно разумное требование к анализатору \- иметь возможность вернуться к ошибкам, найденным в старом коде\. Рассмотрим реализацию такого сценария использования PVS\-Studio на примере анализа C\# проекта\.

## Реализация сценария работы разработчика с PVS\-Studio

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

Рассмотрим сценарий работы с PVS\-Studio на примере проекта Sharp Developer\. Ошибки, найденные в этом проекте, мы уже обсудили в рамках [предыдущей статьи](https://pvs-studio.ru/ru/blog/posts/csharp/0359/)\.

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

PVS\-Studio анализатор встраивается в среду Visual Studio при инсталляции\. Использование анализатора в Visual Studio \- это самый простой способ работы с ним\.

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

![0364_Best_practices_ru/image1.png](https://import.viva64.com/docx/blog/0364_Best_practices_ru/image1.png)

Рисунок 1\. Проверка всего решения\.

В рамках проекта Sharp Developer анализатор обнаружил 20 предупреждения высокой важности, 32 \- средней и 182 \- низкой\.  По умолчанию, программист видит предупреждения только высокой важности, именно с них мы рекомендуем начинать, а затем переходить к предупреждениям низкой важности\.

![0364_Best_practices_ru/image3.png](https://import.viva64.com/docx/blog/0364_Best_practices_ru/image3.png)

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

Разработчик и рад бы сразу начать исправлять ошибки, но уже сегодня он должен работать над новой задачей, а разбор текущих предупреждений необходимо отложить\. Анализатор позволяет воплотить такой сценарий\. Достаточно подавить предупреждения и начать использовать анализатор для нового кода, а позже вернуться к предупреждениям в старом коде\.

Для этого в рамках анализатора нужно сделать 2 действия:

1. Подавить текущие сообщения анализатора\.
1. Настроить его таким образом, чтобы он анализировал только новый написанный код\. 

## Подавление предупреждений с возможностью в дальнейшем к ним вернуться

Чтобы временно подавить предупреждения, выберите пункт меню "Suppress Messages"\.

![0364_Best_practices_ru/image4.png](https://import.viva64.com/docx/blog/0364_Best_practices_ru/image4.png)

Рисунок 3\. Массовая разметка предупреждений, как неинтересных в данный момент времени\.

Затем в новом окне нажмите "Suppress Current Messages"\. 

Все предупреждения из одного проекта будут записаны в xml формате и сохранены с расширением "\.suppress" в папке проекта\. Эти предупреждения не будут показываться в окне PVS\-Studio в Visual Studio, если вы отдельно не отметили это в настройках\. 

Разработчик подавил все предупреждения, и он видит окно PVS\-Studio без ошибок\. Следующий шаг начать получать предупреждения анализатора только для нового кода\. 

## Анализ нового написанного кода

По умолчанию для того чтобы увидеть новые ошибки, после сборки проекта с новым кодом вам нужно будет перезапустить анализатор для проекта или решения \(solution\)\. Это избыточный вариант\. Значительно более элегантное решение \- воспользоваться инкрементальным анализом и проверять новый код с помощью PVS\-Studio сразу после сборки проекта\. Чтобы подключить инкрементальный анализ выберете в пункте меню "Analysis after Build"\. 

![0364_Best_practices_ru/image5.png](https://import.viva64.com/docx/blog/0364_Best_practices_ru/image5.png)

Рисунок 4\. Включение/выключение автоматической проверки файлов после компиляции\.

Посмотрим как это работает\.  Предположим мы написали простой класс:

```cpp
class TestAnalyzer
{
    public void Logging(DateTime dateTime)
    {
        System.IO.File.WriteAllText(
                        @"S:\path\to\file.log", 
                        String.Format("Logging time: {1}h {2}m", 
                        dateTime.Hour, 
                        dateTime.Minute));
    }

    private void OnLoad() 
    {
        Console.WriteLine("Event!");
        Logging(DateTime.Now);
    }

    private void OnClose()
    {
        Console.WriteLine("Event!");
        Logging(DateTime.Now);
    }
}
```

Собрали его\. Анализатор покажет  2 предупреждения\. 

![0364_Best_practices_ru/image6.png](https://import.viva64.com/docx/blog/0364_Best_practices_ru/image6.png)

Рисунок 5\. Пример работы инкрементального анализа\.

Давайте посмотрим как можно поработать с этими предупреждениями\. 

## Обработка предупреждений



**Реальная ошибка**

Предупреждение V3025 является ошибкой\. Рассмотрим ее суть\. Разработчик пытается обратиться к параметру dateTime\.Minute, используя индекс 2, но нумерация аргументов другая \-dateTime\.Hour \- индекс 0, dateTime\.Minute \- индекс 1, поэтому необходимо использовать индексы 0 и 1 при обращении к параметрам\. Исправим проблему заменой строки:

```cpp
System.IO.File.WriteAllText(
                @"S:\path\to\file.log", 
                String.Format("Logging time: {1}h {2}m", 
                dateTime.Hour, 
                dateTime.Minute));
```

На строку

```cpp
System.IO.File.WriteAllText(
                @"S:\path\to\file.log", 
                String.Format("Logging time: {0}h {1}m", 
                dateTime.Hour,
                dateTime.Minute));
```

**Ложное срабатывание**

Во втором случае анализатор слишком придирается к разработчику и считает, что не может быть одной и той же логики в обработчике событий OnLoad и OnClose \. Мы понимаем, что конкретно в нашем случае это нормально, и решаем что это ложное срабатывание\. Для того чтобы пометить предупреждение  как ложное срабатывание, достаточно кликнуть по нему правой кнопкой мыши и выбрать "Mark selected messages  as False Alarms"

![0364_Best_practices_ru/image7.png](https://import.viva64.com/docx/blog/0364_Best_practices_ru/image7.png)

Рисунок 6\. Подавление конкретного предупреждения путём добавления специального комментария в код\.

После этого анализатор добавит к строке, для которой он вывел предупреждение, комментарий вида "//\-V3013"\. Больше он не будет выдавать предупреждение V3013 на эту строку кода\. Подробнее про ложные срабатывания и их обработку можно в статье  "[Подавление ложных предупреждений](https://pvs-studio.ru/ru/docs/manual/0017/)"\.

Следует отметить, что в рамках анализатора используется продвинутый алгоритм определения нового кода\. Если вы не будете создавать новый класс, а будете что\-то менять в старом коде, анализатор сможет определить необходимость перепроверки такого файла\. Больше про это можно [прочитать в документации](https://pvs-studio.ru/ru/docs/manual/0024/)\. 

## Последовательное возвращение предупреждение, найденных в старом коде

И вот у разработчика выдалось время, и он хочет начать  работать с предупреждениями в старом коде\. Нет ничего проще\. Нужно выбрать Suppress Messages в меню, а затем выбрать для какого проекта показать предупреждения, например, для ICSSharpCode\.SharpDevelop\.

![0364_Best_practices_ru/image8.png](https://import.viva64.com/docx/blog/0364_Best_practices_ru/image8.png)

Рисунок 7\. Удаление проекта из списка\.

Затем нужно нажать кнопку "Delete Selected Files"\. Файл NameOfTheProject\.suppress из папки проекта будет удален физически, и анализатор больше не будет скрывать найденные предупреждения в проекте\. Чтобы увидеть предупреждения, достаточно запустить анализатор для проекта, в котором вы отменили подавление предупреждений\. 

![0364_Best_practices_ru/image9.png](https://import.viva64.com/docx/blog/0364_Best_practices_ru/image9.png)

Рисунок 8\. Проверка одного выбранного проекта\.

После запуска вы увидите предупреждения анализатора для данного проекта\. И сможете с ними начать работать\.

## Выводы и рекомендации

В статье рассматривается процесс работы с анализатором с точки зрения отдельного разработчика\. Мы рекомендуем придерживаться этого процесса\. А еще советуем запускать проверку исходного кода на сервере\. Разработчик может пропустить сообщение анализатора или забыть его обработать\. Подробнее об этом можно почитать в документации в статье:

* [Проверка C\# проектов из командной строки\.](https://pvs-studio.ru/ru/docs/manual/0035/)

Надеюсь у вас не осталось вопросов по пользованию анализатором\! Если все же они есть, напишите на [support@viva64\.com](mailto:support@viva64.com), мы с удовольствием ответим\.