>
>
Интеграция PVS-Studio с системой распре…

Павел Еремеев
Статей: 38

Интеграция PVS-Studio с системой распределённой сборки Incredibuild

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

Данная публикация устарела. Актуальное описание использования PVS-Studio с Incredibuild доступно в соответствующем разделе документации

Введение

Любой разработчик, у кого компиляция проекта занимает более получаса, знает о существовании продукта 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 в текущих версиях. Если у вас будут какие-то трудности – обязательно пишите нам, и мы поможем.