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

Введение

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

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

Для определения наличия модификаций в файлах с исходным кодом 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', расположенные в тех же директориях, где находятся проектные файлы.
  • Analyze – выполнить инкрементальный анализ. Этот шаг должен выполняться после выполнения шага 'Scan', и может выполняться как до, так и после сборки решения или проекта. Статический анализ будет выполнен только для измененных файлов с момента последней сборки. Если в настройках PVS-Studio опция 'Remove Intermediate Files' установлена в 'True', временные директории '.pvs-studio' будут удалены.
  • ScanAndAnalyze - проанализировать все зависимости для определения того, на каких файлах должен быть выполнен инкрементальный анализ, и сразу же выполнить инкрементальный анализ измененных файлов с исходным кодом. Этот шаг необходимо выполнить перед сборкой проекта\решения.

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

Недостатки инкрементального анализа в Microsoft Visual Studio

Если PVS-Studio использует препроцессор CL.exe, входящий в состав Visual C++ то изредка возникает неприятная ситуация с блокированием файлов. Выглядеть это может так. Вы поправили файл и скомпилировали его. Запустился инкрементальный анализ. В этот момент вы заметили мелкий недостаток, быстро его поправили и вновь попытались скомпилировать файл. Среда Visual Studio предупредит, что отредактированный файл не может быть записан, так как какая-то программа заблокировала его. Этой программой является CL.exe, выполняющий препроцессирование. К сожалению, с этой блокировкой мы ничего сделать не можем. Если возникла такая ситуация, то следует подождать несколько секунд и продолжить прерванную работу. Заметим, что при использовании препроцессора Clang (опция настроек 'Preprocessor') такая ситуация возникает значительно реже. Поэтому при возможности, используйте Clang в качестве препроцессора.


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

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

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

goto PVS-Studio;