Режим инкрементального анализа PVS-Studio


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

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

Использование инкрементального анализа

Основная задача, решаемая при использовании режима инкрементального анализа - автоматизация запуска анализатора на машине разработчика сразу же после компиляции кода. Фактически, такой режим работы PVS-Studio приближает по удобству использования инструмент к ключу '/analyze' в некоторых версиях Visual Studio. И при этом с намного более удобным интерфейсом и сценариями использования. Теперь вы просто работаете над кодом, компилируете его и периодически получаете сообщения о возможных проблемах от анализатора. Так как анализатор работает в фоне (количество используемых для анализа ядер можно настроить, опция 'ThreadCount'), то использование PVS-Studio не мешает работе других программ. И это значит, что инструмент легко можно установить на машины большого количества (или всех) разработчиков в отделе, чтобы выявлять проблемы в коде сразу же в момент их появления.

Включить режим послесборочного инкрементального анализа можно в меню "PVS-Studio -> Analysis after Build (Modified Files Only)" (рисунок 1), данный пункт активирован в PVS-Studio по-умолчанию.

Рисунок 1 — Управление режимом инкрементального анализа PVS-Studio

Рисунок 1 — Управление режимом инкрементального анализа PVS-Studio

После активации режима инкрементального анализа PVS-Studio станет автоматически в фоновом режиме производить анализ всех затронутых модификациями файлов сразу после окончания сборки проекта. Если PVS-Studio обнаружит такие модификации, инкрементальный анализ будет автоматически запущен, а в области уведомлений Windows появится анимированная иконка PVS-Studio (рисунок 2). Обратите внимание, что нередко в Windows новые иконки в этой области оказываются скрыты.

Рисунок 2 — PVS-Studio в процессе инкрементального анализа

Рисунок 2 — PVS-Studio в процессе инкрементального анализа

Контекстное меню области уведомлений позволяет на время приостановить (команда 'Pause') или отменить (команда 'Abort') текущую проверку.

В случае, если анализатор во время инкрементного анализа обнаружит ошибки в коде, в названии открытой в фоне вкладки окна PVS-Studio отразится число найденных ошибок. Клик по иконке в области уведомлений (либо по самому окну) откроет окно PVS-Studio Output.

Рисунок 3 - Результат инкрементального анализа: найдено 15 подозрительных участков кода

Рисунок 3 - Результат инкрементального анализа: найдено 15 подозрительных участков кода

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

Ограничение времени работы инкрементального анализа в IDE

При работе из IDE можно задать ограничение на время работы инкрементального анализа. Данную настройку можно регулировать в меню настроек PVS-Studio на вкладке 'Specific Analyzer Settings' ('IncrementalAnalysisTimeout').

По истечении установленного таймаута анализ файлов будет прерван, все найденные предупреждения будут выведены в окно PVS-Studio. Дополнительно к ним будет выдано предупреждение о том, что анализатор не успел обработать все изменённые файлы, а также информация суммарном и проанализированном количестве файлов.

Порядок работы инкрементального анализа в IDE

Для определения наличия модификаций в файлах с исходным кодом PVS-Studio контролирует состояние объектных файлов (obj/o файлы), генерируемых компилятором C++ для каждого C/C++ файла, либо состояние бинарных файлов-сборок (assembly) у C#-проектов. В момент перед непосредственным началом сборки в среде, IDE плагин PVS-Studio фиксирует наличие объектных файлов и время их модификации для всех компилируемых файлов проекта. Для определения модифицированных файлов в C/C++ проектах, для которых должен быть выполнен инкрементальный анализ, используются средства MSBuild для работы с журналами отслеживания файлов (file tracking logs) (файлы *.tlog). Такой подход, во-первых, позволяет нам определять измененные файлы, для которых будет выполнен инкрементальный анализ, тем же способом, которым это делает MSBuild, а во-вторых, избавляет от необходимости строить соответствия между заголовочными файлами и файлами с исходным кодом. Для C#-проектов журналы отслеживания файлов не создаются, поэтому для того, чтобы определить, для каких файлов должен быть выполнен инкрементальный анализ, плагин строит соответствие между файлами с исходным кодом и бинарным файлом сборки (assembly), являющимся результатом компиляции проекта, и фиксирует те файлы, которые были изменены после того, как сборка была построена. После сборки инкрементальный анализ запускается автоматически в фоновом режиме.

Поддержка инкрементального анализа в модуле командной строки

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

Доступны следующие режимы работы инкрементального анализа:

  • Scan - проанализировать все зависимости для определения того, на каких файлах должен быть выполнен инкрементальный анализ. Непосредственно анализ выполнен не будет. Этот шаг должен выполняться перед сборкой решения или проекта. Результаты сканирования будут записаны во временные директории '.pvs-studio', расположенные в тех же директориях, где находятся проектные файлы. При этом будут учтены изменения, произведенные с момента последней сборки, предыдущая история изменений будет удалена.
  • AppendScan - проанализировать все зависимости для определения того, на каких файлах должен быть выполнен инкрементальный анализ. Непосредственно анализ выполнен не будет. Этот шаг должен выполняться перед сборкой решения или проекта. Результаты сканирования будут записаны во временные директории '.pvs-studio', расположенные в тех же директориях, где находятся проектные файлы. Будут учтены изменения, произведенные с момента последней сборки, а также все предыдущие изменения.
  • Analyze - выполнить инкрементальный анализ. Этот шаг должен выполняться после выполнения шагов Scan или AppendScan, и может выполняться как до, так и после сборки решения или проекта. Статический анализ будет выполнен только для файлов из списка, полученного в результате выполнения команд Scan или AppendScan. Если в настройках PVS-Studio опция 'Remove Intermediate Files' установлена в 'True', временные директории '.pvs-studio' будут удалены.
  • ScanAndAnalyze - проанализировать все зависимости для определения того, на каких файлах должен быть выполнен инкрементальный анализ, и сразу же выполнить инкрементальный анализ измененных файлов с исходным кодом. Этот шаг необходимо выполнить перед сборкой проекта\решения. Будут учтены изменения, произведенные с момента последней сборки.

Аргументы модуля командной строки (PVS-Studio_Cmd.exe) для запуска инкрементального анализа описаны в разделе "Проверка Visual C++ (.vcxproj) и Visual C# (.csproj) проектов из командной строки с помощью PVS-Studio".

Инкрементальный анализ при использовании системы мониторинга компиляции

В случае необходимости инкрементального анализа при использовании системы мониторинга компиляции, достаточно "отслеживать" инкрементальную сборку, т.е. компиляцию тех файлов, которые были изменены с момента последней сборки. Этот сценарий использования позволит анализировать только изменённый/новый код.

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

Более подробно система мониторинга компиляции описана в статье "Система мониторинга компиляции в PVS-Studio".

Совместное использование режимов полного и инкрементального анализа

Как отмечалось в начале статьи, исправление ошибки тем дешевле, чем раньше она обнаружена. Для выполнения этой задачи (как можно более раннее обнаружение дефектов в коде), как и было описано ранее, и предназначен механизм инкрементального анализа. Однако у кого-то может возникнуть мысль о том, что только одного инкрементального анализа будет вполне достаточно для выявления потенциальных ошибок в коде - ведь они будут обнаруживаться непосредственно в процессе разработки. Это утверждение ошибочно.

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

Из вышеописанных ситуаций следует важный вывод - статический анализ должен быть разделён на несколько фаз, что позволит обнаруживать ошибки, которые каким-то образом прошли предыдущую фазу.

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

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

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

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

Более подробно процесс конфигурирования анализатора для сборочного сервера описан в статье "Встраивание PVS-Studio в процесс непрерывной интеграции".


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

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

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

goto PVS-Studio;