PVS-Studio выполняет анализ C/C++ кода и подсказывает программисту, где скрываются ошибки, или указывает на участки кода, которые могут стать проблемными в будущем. Если разрабатываемый проект достаточно большой, то анализ может занимать весьма много времени. Для ускорения анализа большого проекта можно воспользоваться инструментом IncrediBuild. Если у вас уже установлен анализатор PVS-Studio и инструмент IncrediBuild, то из статьи вы узнаете, как их можно подружить и добиться ускорения анализа. В дальнейшем анализатор PVS-Studio будет еще плотней интегрироваться с IncrediBuild. Но ещё раз повторим, что распараллелить запуск PVS-Studio на нескольких машинах можно уже сейчас. Это просто. И в статье мы расскажем, как это сделать.


Введение


Любой разработчик, у кого компиляция проекта занимает более получаса, знает о существовании продукта IncrediBuild. Это решение предназначено для ускорения компиляции путем распределенной сборки на несколько машин. В итоге компиляцией проекта одновременно занимается несколько компьютеров (например, четыре). Каждый компьютер компилирует свою часть файлов и в результате общее время сборки сокращается в несколько раз.

В последнее время к нам стали обращаться пользователи PVS-Studio с просьбой добавить поддержку IncrediBuild в наше решение. Мы связались с командой разработчиков IncrediBuild и попросили содействия. Команда IncrediBuild с радостью откликнулась, и теперь мы готовы поделиться способом как совместно использовать PVS-Studio и IncrediBuild.

Сейчас (в версии PVS-Studio 5.25) пользователь, установивший PVS-Studio на свою машину, не увидит в меню своей IDE пункта «проверить проект в PVS-Studio с помощью IncrediBuild». Возможно, что в следующих версиях PVS-Studio такой пункт меню появится. Но уже сейчас пользователь IncrediBuild может получить выгоды от этой системы при использовании PVS-Studio. Нужно только чуть-чуть магии. И в этой статье рассказано, какие заклинания надо произнести.

Как работает PVS-Studio?


Какую цель может преследовать человек, желающий интегрировать PVS-Studio с IncrediBuild? Думаю, вполне очевидно, что конечной целью этого должно стать уменьшение времени, необходимого для анализа исходных файлов. Давайте разберёмся, что же, на самом деле, представляет собой «проверка кода в PVS-Studio» и как его «подсоединить» к IncrediBuild.

IncrediBuild в первую очередь предназначен для распределения сборочных задач между доступными вычислительными ресурсами, то есть между компьютерами разработчиков. Что именно нужно распределять в случае запуска статического анализатора PVS-Studio?

Непосредственную проверку исходных C/C++ файлов PVS-Studio осуществляет с помощью command line утилиты PVS-Studio.exe. Эта утилита – ядро анализатора, по принципу своего использования она очень близка к C++ компилятору. В частности, PVS-Studio.exe требуется запускать каждый раз для проверки каждого исходного файла, передавая в эту утилиту все параметры компиляции этого файла и дополнительные параметры.

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

Стоит отметить, что PVS-Studio.exe не предназначен для «ручного» использования – его нельзя просто «натравить» на директорию с исходными файлами. Как раз для автоматизации этой процедуры запуска и служит плагин PVS-Studio, интегрирующийся в среду разработки Visual Studio. Как вариант можно использовать оболочку PVS-Studio Standalone.

Конечно, в случае использования сборочной системы, отличной от MSBuild, запуск PVS-Studio.exe можно встроить и в другие сборочные системы, однако, это не отменяет того принципа, что PVS-Studio.exe не должен использоваться напрямую пользователем анализатора.

Думаю, теперь нам очевидно, что для оптимизации работы анализатора необходимо распределить процедуру анализа на этапе запуска процессов PVS-Studio.exe. Эта ситуация очень схожа с тем, как Incredibuild работает при обычной сборке проекта – распределяет запуски компиляторов (например, cl.exe) и линковщиков.

При этом IncrediBuild «обманывает» локальную сборочную систему. MSBuild.exe запускает процессы компиляции и линковки как бы «локально», а IncrediBuild «втихую» разносит непосредственно реальную работу этих процессов по доступному ему вычислительным узлам (компьютерам).

Само собой, очевидно, что IncrediBuild не ограничен в том, какие именно процессы можно разносить по вычислительным узлам. Как же нам с его помощью «обмануть» PVS-Studio? В нашем случае, «обманывать» нам нужно будет того, кто занимается непосредственным запуском процессов PVS-Studio.exe.

Для примера остановимся на том, что пользователь имеет проект в Microsoft Visual Studio, собираемый в MSBuild. Тогда для проверки этого проекта он, скорее всего, будет использовать плагин PVS-Studio для данной IDE. Плагин IDE – это часть самой IDE, поэтому мы можем теперь назвать того, кого нам предстоит «обмануть» – devenv.exe – процесс, который и является той самой Microsoft Visual Studio.

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

Всё это означает, что пользователь не будет запускать проверку каждый раз «вручную», выбирая пункт меню 'Check Solution'. Как же он тогда поступит?
"C:\Program Files (x86)\Microsoft Visual Studio
 12.0\Common7\IDE\devenv.exe" "D:\Test\OmniSample\OmniSample 
 (vs2013).sln" /command "PVSStudio.CheckSolution 
 Win32|Release|D:\Test\OmniSample\test.plog"

Выше приведена строка запуска анализа PVS-Studio для проекта OmniSample (vs2013).sln, конфигурации Win32|Release. По завершению анализа процесс devenv.exe автоматически завершится. Лог проверки будет сохранён в D:\Test\OmniSample\test.plog. Это – «стандартный» способ использования PVS-Studio из командной строки, про который можно подробнее почитать здесь.

Ещё раз повторим, что это не единственный способ использовать PVS-Studio, но для наглядности остановимся именно на нём.

Что же произойдёт при выполнении данной команды? Запущенный процесс devenv.exe начнёт параллельно запускать процессы PVS-Studio.exe, как мы говорили ранее, по одному на исходный файл. Сколько парольных процессов будет запущено указано в настройках анализатора и эту настройку можно изменить. По умолчанию, PVS-Studio будет запускать одновременно столько процессов, сколько есть логических ядер в системе.

Как может помочь IncrediBuild?


Предположим теперь, что у нас есть проект из 1000 файлов, и мы запускаем анализ на машине с 4 ядрами. Это означает, что анализатору devenv.exe придётся сделать 250 итераций (по 4 процесса) для того, чтобы успешно проверить весь проект. Как же IncrediBuild может нам помочь?

Предположим, что у пользователя PVS-Studio есть ещё 3 машины, и на каждой также доступно по 4 процессорных ядра. Если бы мы могли «разнести» запуски PVS-Studio.exe по этим 4 машинам, то нам потребовалось бы уже не 250 «итераций», а всего лишь 62,5 (ведь у нас есть 16 ядер).

Для того, чтобы распределить запуски анализаторов на разных компьютерах, воспользуемся command line утилитой IBConsole:
ibconsole /command=incredi.bat /profile=incredi.xml

Файл incredi.xml должен при этом иметь такое содержание:
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Profile FormatVersion="1">
  <Tools>
    <Tool Filename="devenv" AllowIntercept="true" />
    <Tool Filename="PVS-Studio" AllowRemote="true" />
  </Tools>
</Profile>

Как видно, мы «перехватываем» активность devenv и позволяем «распределять» процессы PVS-Studio. В файле incredi.bat необходимо прописать строку запуска devenv.exe, приведённую в статье ранее. Также, нужно не забыть сменить в настройках PVS-Studio уровень распараллеливания с 4 до 16.

Предположим, что IncrediBuild заранее был установлен и корректно настроен на 4-х машинах. Теперь после запуска команды ibconsole мы увидим, что запуски PVS-Studio.exe распределяются между этими 4 компьютерами, и общее время анализа сократится.

При этом, на всех машинах, кроме той, на которой выполняется данная команда, нет необходимости держать как PVS-Studio и Visual Studio, так и проверяемые исходники. IncrediBuild об этом позаботится за вас.

На сколько же сократится время анализа? Вначале может показаться, что оно сократится ровно в 4 раза, ведь у нас теперь есть 16 ядер, а не 4. На самом деле, это число будет меньше четырёх, и зависит от очень многих факторов. К этим факторам относится производительность компьютеров, их загруженность другими задачами, пропускная способность сети и много другое. Но можно точно утверждать, что оно будет меньше 4, т.к. в любом случае будет наблюдаться «эффект бутылочного горлышка». Ведь инициатор анализа (devenv.exe), должен обрабатывать результаты запусков PVS-Studio.exe. В наших опытах, при задействовании 4 машин, мы получали ускорение в 2.5-3.5 раза.

Если пользователь захочет всё же запустить анализ вручную, выбрав пункт 'Check Solution', то достаточно просто изменить содержимое файла incredi.bat, прописав туда простой вызов devenv.exe – откроется окно Visual Studio, в котором можно будет проделать все эти действия, пользуясь преимуществами распределённого запуска анализаторов. Конечно, это совсем не так удобно, как просто открыть Visual Studio и выбрать там пункт меню «проверить в IncrediBuild», и в будущем такой пункт может действительно появится в меню PVS-Studio.

Заключение


Вы уже сейчас можете использовать совместно IncrediBuild и PVS-Studio в текущих версиях. Если у вас будут какие-то трудности – обязательно пишите нам, и мы поможем.


Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Paul Eremeev. Integrating PVS-Studio with the IncrediBuild Distributed Build System.

Прочитали статью и есть вопрос?
Часто к нашим статьям задают одни и те же вопросы. Ответы на них мы собрали здесь: Ответы на вопросы читателей статей про PVS-Studio, версия 2015. Пожалуйста, ознакомьтесь со списком.

Комментарии (0)