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

22.01.2013

Введение

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

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

Две задачи, которые решаются с помощью инкрементального анализа

  • Автоматизация запуска анализатора сразу же после компиляции на машине разработчика.
  • Получение выгоды от внедрения статического анализа в большом проекте БЕЗ необходимости проверки всего проекта. Фактически вы можете начать внедрять статический анализ кода, проверяя только тот код (те файлы), который модифицируется разработчиками в настоящее время и не лезть в кучу старых файлов, которые не модифицируются.

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

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

Включить режим послесборочного инкрементального анализа можно в меню PVS-Studio/Incremental Analysis After Build (Incremental Analysis After Make) (рисунок 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) текущую проверку. Иногда бывает полезно временно отключить инкрементальный анализ. Как, например, при редактировании базовых h-файлов, которое приводит к перекомпиляции большого количества файлов. Чтобы отключить инкрементальный анализ не навсегда, а временно, можно воспользоваться командами контекстного и главного меню PVS-Studio 'Disable incremental analysis until IDE restart' (рисунки 1 и 2).

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

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

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

Для определения наличия модификаций в файлах с исходным кодом PVS-Studio контролирует состояние объектных файлов (obj/o файлы), генерируемых компилятором C++ для каждого C/C++ файла. В момент перед непосредственным началом сборки в среде, IDE плагин PVS-Studio фиксирует наличие объектных файлов и время их модификации для всех C/C++ файлов проекта. В случае если проект содержит большое количество файлов, это может привести к едва заметному подвисанию IDE в момент начала сборки. А после сборки сравнивает их конечное состояние с зафиксированным до начала сборки. И запускает инкрементальный анализ для тех C/C++ файлов, объектные файлы для которых были перегенерированы или сгенерированы заново. Стоит заметить, что анализ будет произведён только для тех файлов, для которых компилятор сгенерировал объектные файлы по окончании сборки. В случае возникновения ошибок компиляции или линковки анализ соответствующих C/C++ файлов производиться не будет, т.к. компилятор не произведёт перегенерации их объектных файлов.

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

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