Общие сведения о принципах работы с анализатором PVS-Studio


Аннотация

Статья представляет собой учебное пособие (tutorial) по работе с анализатором кода PVS-Studio на платформе Windows. Данный раздел содержит примеры выполнения наиболее общих задач.

С особенностями использования анализатора PVS-Studio для Linux вы можете ознакомиться в разделе документации "Как запустить PVS-Studio в Linux".

Системные требования и установка PVS-Studio

Анализатор PVS-Studio на платформе Windows интегрируется в среды разработки Microsoft Visual Studio 2017, 2015, 2013, 2012, 2010. Системные требования к анализатору можно посмотреть в соответствующем разделе документации.

Получив установочный пакет PVS-Studio, можно приступить к установке программы.

Рисунок 1 - Установка PVS-Studio

Рисунок 1 - Установка PVS-Studio

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

Рисунок 2 - Варианты интеграции PVS-Studio в различные IDE

Рисунок 2 - Варианты интеграции PVS-Studio в различные IDE

Для того чтобы удостовериться, что инструмент PVS-Studio корректно установлен, можно запустить IDE и открыть окно About (пункт меню Help). При этом анализатор PVS-Studio должен присутствовать в списке установленных компонентов (рисунок 3).

Рисунок 3 - окно About Microsoft Visual Studio с установленным компонентом PVS-Studio

Рисунок 3 - окно About Microsoft Visual Studio с установленным компонентом PVS-Studio

Знакомство с PVS-Studio

Откроем тестовый проект в Microsoft Visual Studio (в любой имеющейся версии). Открыв проект, запустим проверку всех файлов командой главного меню IDE "PVS-Studio -> Check -> Solution" (рисунок 4).

Рисунок 4 — запуск анализа PVS-Studio

Рисунок 4 — запуск анализа PVS-Studio

После запуска проверки на экране появится индикатор прогресса с кнопками Pause (приостановить анализ) и Stop (прервать анализ). Обнаруженные потенциально опасные конструкции во время анализа будут выводиться в окно найденных дефектов (рисунок 5).

Рисунок 5 - Анализ проекта

Рисунок 5 - Анализ проекта

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

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

Исправление ошибок

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

V579 The memset function receives the pointer and its size as arguments. It is possibly a mistake. Inspect the third argument. sample1.cpp 7

Вот соответствующий ей код:

  data->num = 10000;
  data->sum = 10000;
  memset(data, 0, sizeof(data));

Здесь проблема в том, что структура 'data' будет заполнена нулями не полностью. Ошибка заключается в том, что высказывание 'sizeof(data)' записано некорректно. Для исправления ситуации необходимо передать функции 'memset' корректный размер структуры 'data':

    memset(data, 0, sizeof(*data));

Узнать об этом исправлении можно из справочной системы. Нажав на поле с кодом ошибки в столбце 'Code', мы увидим открывшееся окно с описанием данной ошибки (рисунок 6 для Microsoft Visual Studio):

Рисунок 6 - Подробное описание ошибки, а также способы исправления

Рисунок 6 - Подробное описание ошибки, а также способы исправления

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

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

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

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

Рисунок 7 - Отключение некоторых диагностических сообщений по коду

Рисунок 7 - Отключение некоторых диагностических сообщений по коду

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

Теперь рассмотрим другой вариант фильтрации на основе текста диагностических сообщений. Вернемся к нашему примеру. Одной из ошибок в этом примере является всегда истинное высказывание 'N >= 0':

V547 Expression 'N >= 0' is always true. Unsigned type value is always >= 0. sample1.cpp 18

Вот код:

if (TEST(N))
{
  data->num = N;
}

Конечно, можно просто исправить код на корректный, и сообщение исчезнет. Но проблема в том, что здесь используется макрос, который может быть корректен на некоторых платформах. И если подобного кода с такой проверкой много, а вы точно знаете, что код корректен, то можно "попросить" анализатор кода не выдавать сообщения, в тексте которых используются слова 'Expression 'N >= 0' is always true'. Делается это с помощью настроек на странице Keyword Message Filtering:

Рисунок 8 - Отключение некоторых диагностических сообщений по тексту

Рисунок 8 - Отключение некоторых диагностических сообщений по тексту

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

Последним механизмом сокращения количества диагностических сообщений является фильтрация по маскам имён файлов проекта и путям к ним.

Предположим, в вашем проекте используется библиотека Boost. Анализатор будет, конечно же, сообщать и о потенциальных проблемах в этой библиотеке. Однако, если вы уверены, что эти сообщения не стоит учитывать, то можно просто добавить путь к папке с Boost на странице Don't check files (рисунок 9):

Рисунок 9 - Настройка фильтрации сообщений по расположению и именам файлов

Рисунок 9 - Настройка фильтрации сообщений по расположению и именам файлов

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

Также в PVS-Studio имеется функция "Mark as False Alarm". Благодаря ей возможно пометить в исходном коде те строки, в которых происходит ложное срабатывание анализатора кода. После разметки, анализатор более не будет выдавать диагностических сообщений на такой код. Это позволяет более удобно постоянно использовать анализатор в процессе разработки программного обеспечения для проверки нового кода.

Так в этом примере отключен вывод диагностического сообщения с кодом V640:

  for (int i = 0; i < m; ++i)
    for (int j = 0; j < n; ++j)
      matrix[i][j] = Square(i) + 2*Square(j);
    cout << "Matrix initialization." << endl; //-V640
...

Подробно эта возможность описана в разделе "Подавление ложных предупреждений".

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

Надо ли добиваться исправления всех потенциальных ошибок, на которые указывает анализатор?

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

Таким образом, добиваться исправления всех потенциальных проблем, на которые указывает анализатор кода, смысла, конечно же, нет.

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


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

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

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

goto PVS-Studio;