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

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


> Данная публикация устарела\\\. Актуальное описание использования PVS\\\-Studio с Incredibuild доступно в \[соответствующем разделе\]\(https://pvs\-studio\.ru/ru/docs/manual/0041/\) документации

![0338_IncrediBuild_ru/image1.png](https://import.viva64.com/docx/blog/0338_IncrediBuild_ru/image1.png)

## Введение

Любой разработчик, у кого компиляция проекта занимает более получаса, знает о существовании продукта [Incredibuild](https://www.incredibuild.com/)\. Это решение предназначено для ускорения компиляции путем распределенной сборки на несколько машин\. В итоге компиляцией проекта одновременно занимается несколько компьютеров \(например, четыре\)\. Каждый компьютер компилирует свою часть файлов и в результате общее время сборки сокращается в несколько раз\.

В последнее время к нам стали обращаться пользователи [PVS\-Studio](https://pvs-studio.ru/ru/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 требуется запускать каждый раз для проверки каждого исходного файла, передавая в эту утилиту все параметры компиляции этого файла и дополнительные параметры\. 

Примечание\. Параметры компиляции нужны анализатору, так как ему нужно сначала [препроцессировать](https://pvs-studio.ru/ru/blog/terms/0040/) файл\. Соответственно, он должен знать какие директивы препроцессора объявлены, где искать заголовочный файлы и так далее\.

Стоит отметить, что PVS\-Studio\.exe не предназначен для "ручного" использования – его нельзя просто "натравить" на директорию с исходными файлами\. Как раз для автоматизации этой процедуры запуска и служит плагин PVS\-Studio, интегрирующийся в среду разработки Visual Studio\. Как вариант можно использовать оболочку [PVS\-Studio Standalone](https://pvs-studio.ru/ru/docs/manual/0033/)\.

Конечно, в случае использования сборочной системы, отличной от 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'\.  Как же он тогда поступит?

```cpp
"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 из командной строки, про который можно подробнее почитать [здесь\.](https://pvs-studio.ru/ru/docs/manual/0001/)

Ещё раз повторим, что это не единственный способ использовать 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](https://incredibuild.atlassian.net/wiki/spaces/ium/pages/9470030/incredibuild+windows+user+manual#IBConsole.html):

```cpp
ibconsole /command=incredi.bat /profile=incredi.xml
```

Файл incredi\.xml должен при этом иметь такое содержание:

```cpp
<?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 в текущих версиях\. Если у вас будут какие\-то трудности – обязательно [пишите нам](mailto:support@viva64.com), и мы поможем\.