Практика использования анализатора 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

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

Рассмотрим сценарий работы с PVS-Studio на примере проекта Sharp Developer. Ошибки, найденные в этом проекте, мы уже обсудили в рамках предыдущей статьи.

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

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

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

https://import.viva64.com/docx/blog/0364_Best_practices_ru/image1.png

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

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

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

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

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

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

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

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

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".

https://import.viva64.com/docx/blog/0364_Best_practices_ru/image5.png

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

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

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 предупреждения.

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 при обращении к параметрам. Исправим проблему заменой строки:

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

На строку

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"

https://import.viva64.com/docx/blog/0364_Best_practices_ru/image7.png

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

После этого анализатор добавит к строке, для которой он вывел предупреждение, комментарий вида "//-V3013". Больше он не будет выдавать предупреждение V3013 на эту строку кода. Подробнее про ложные срабатывания и их обработку можно в статье "Подавление ложных предупреждений".

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

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

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

https://import.viva64.com/docx/blog/0364_Best_practices_ru/image8.png

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

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

https://import.viva64.com/docx/blog/0364_Best_practices_ru/image9.png

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

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

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

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

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



Найдите ошибки в своем C, C++, C# и Java коде

Предлагаем попробовать проверить код вашего проекта с помощью анализатора кода PVS-Studio. Одна найденная в нём ошибка скажет вам о пользе методологии статического анализа кода больше, чем десяток статей.

goto PVS-Studio;


Найденные ошибки

Проверено проектов
381
Собрано ошибок
13 764

А ты совершаешь ошибки в коде?

Проверь с помощью
PVS-Studio

Статический анализ
кода для C, C++, C#
и Java

goto PVS-Studio;