Система моніторингу компіляції у PVS-Studio

Система моніторингу компіляції (PVS-Studio Compiler Monitoring, CLMonitoring) призначена для "безшовної" інтеграції статичного аналізу PVS-Studio в будь-яку збірну систему на ОС сімейства Windows, що використовує для компіляції файлів один із препроцесорів, які підтримуються command-line аналізатором PVS-S. (Visual C++, GCC, Clang, MDK Keil ARM Compiler 5/6, IAR C/C++ Compiler for ARM).

Аналізатору PVS-Studio.exe для коректного аналізу вихідних C/C++ файлів потрібен проміжний .i (intermediate) файл - результат роботи препроцесора, що містить усі включені у вихідний файл заголовки та розкриті макроси. Ця вимога обумовлює неможливість " просто перевірити " вихідні файли на диску, т.к. окрім вмісту самих файлів, статичному аналізатору потрібна також інформація, необхідна для генерації такого .i файлу. Зауважимо, що PVS-Studio не містить препроцесора і при своїй роботі покладається на зовнішній.

Як випливає з її назви, система, що розглядається, заснована на "відстеження" запусків компілятора під час складання проекту, дозволяючи зібрати всю необхідну інформацію для запуску аналізу (тобто для генерації препроцесованих i файлів) на вихідниках, збірка яких була відстежена. Це, у свою чергу, дозволяє проаналізувати проект, просто запустивши його перескладання, без необхідності від користувача модифікувати свої складальні сценарії.

Система представлена ​​сервером, що відстежує компіляцію (command-line утиліта CLMonitor.exe), та додатком C and C++ Compiler Monitoring UI (Standalone.exe), що здійснює безпосередній запуск статичного аналізу (при необхідності використання командного рядка CLMonitor.exe може також бути використаний і як клієнт).

У поточній версії системане здійснює аналізу ієрархії запущених процесів, а відстежує запуск всіх процесів у системі. Це означає, що якщо буде запущено паралельне складання кількох проектів, система також відстежить запуски компіляторів обох проектів.

Принцип роботи

Сервер моніторингу (CLMonitor.exe) відстежує запуск процесів, що відповідають цільовому компілятору (наприклад, cl.exe у разі Visual C++ або g++.exe у разі GCC) та збирає інформацію про оточення цих процесів. Сервер моніторингу відслідковує запуск процесів тільки для того користувача, з-під якого він сам запущений. Ця інформація необхідна для подальшого запуску статичного аналізу і включає:

  • робочу директорію процесу;
  • повний рядок запуску процесу (тобто ім'я файлу, що виконується, і всі аргументи, з якими він був запущений);
  • повний шлях до виконуваного файлу процесу;
  • системні змінні оточення процесу.

Після завершення складання проекту серверу моніторингу (CLMonitor.exe) необхідно надіслати сигнал про припинення відстеження. Це можна зробити за допомогою того ж CLMonitor.exe, запустивши його в режимі клієнта, так і через інтерфейс Compiler Monitoring UI.

Після завершення моніторингу, сервер, використовуючи зібрану інформацію про процеси, запускає генерацію проміжних (intermediate) файлів для вихідних файлів, які були скомпільовані під час роботи моніторингу. Потім вже виконується запуск безпосередньо статичного аналізатора (PVS-Studio.exe), видаючи на вихід стандартний звіт про роботу PVS-Studio, з яким можна працювати з Compiler Monitoring UI, так і з будь-якого IDE плагіна PVS-Studio.

Використання CLMonitor.exe

Примітка: далі буде описано використання CLMonitor.exe для інтеграціїаналізу в автоматизовану систему збирання. Якщо ви хочете просто перевірити свій проект, то скористайтесь програмою Compiler Monitoring UI.

CLMonitor.exe є сервером моніторингу, який здійснює безпосередньо саме відстеження запусків компіляторів. Його необхідно запустити безпосередньо перед початком складання вашого проекту. У режимі відстеження сервер перехоплюватиме запуски всіх компіляторів, що підтримуються.

Перелічимо далі компілятори, що підтримуються:

  • компілятори сімейства Microsoft Visual C ++ (cl.exe);
  • C/C++ компілятори з GNU Compiler Collection (gcc.exe, g++.exe) та їх похідні;
  • компілятор Clang (clang.exe) та його похідні.
  • Keil MDK ARM Compiler 5/6
  • IAR C/C++ Compiler for ARM
  • Texas Instruments ARM Compiler
  • GNU Arm Embedded Toolchain

Але якщо ви хочете інтегрувати аналіз безпосередньо у вашу збірну систему (або систему безперервної інтеграції тощо), ви не можете просто запустити сервер моніторингу, т.к. даний процес на час своєї роботи блокує інше збирання. Тому потрібно запустити CLMonitor.exe з аргументом monitor:

У цьому режимі CLMonitor запустить сам себе в режимі відстеження і завершить свою роботу, а ваша збірна система зможе продовжити виконувати свої завдання. При цьому другий (запущений з першого) процес CLMonitor залишатиметься запущеним і відстежуватиме складання.

Т.к. в такому режимі роботи жодна консоль не підключена до процесу CLMonitor, то, крім стандартних потоків введення/виводу (stdin\stdout), сервер моніторингу також виводить свої повідомлення в журнал подій Windows (Event Logs - Windows Logs - Application) .

Примітка: для коректної роботисервера відстеження він має бути запущений з правами, еквівалентними правам, з якими запускаються і процеси компіляторів.

Для коректного запису повідомлень у системні журнали подій процес CLMonitor.exe необхідно запустити від імені адміністратора хоча б один раз. Якщо процес жодного разу не стартував із правами адміністратора, повідомлення про помилки не потраплятимуть із системний журнал.

Зверніть увагу, що в системні логи сервер записує лише повідомлення про помилки у своїй роботі (оброблені винятки), а не діагностичні повідомлення від аналізатора!

Після завершення складання запустіть CLMonitor.exe у режимі клієнта для генерації препроцесованих файлів та безпосереднього запуску статичного аналізу:

Як параметр '-l' віддається повний шлях до файлу, який буде записано безпосередні результати роботи статичного аналізатора.

Після запуску в режимі клієнта CLMonitor.exe підключиться до раніше запущеного сервера і отримає від нього інформацію про всі відловлені процеси компіляторів, після чого сервер завершить свою роботу. Клієнт почне запуск препроцесорів і аналізаторів PVS-Studio.exe для всіх відстежених вихідних файлів.

В результаті роботи CLMonitor.exe буде отримано файл-звіту (C:\ptest.plog), який можна відкрити в будь-якому IDE плагіні PVS-Studio або Compiler Monitoring UI (PVS-StudioOpen/SaveOpen Analysis Report).

Ви можете використовувати CLMonitor придушення повідомлень аналізатора за допомогою аргументу '-u':

У параметрі '-u' передається шлях до suppress файлу, отриманого за допомогою діалогу Message Suppression Compiler Monitoring UI (ToolsMessage Suppression. ). Параметр '-s' є необов'язковим і дозволяє дописувати в переданий через '-u' suppress файл.нові повідомлення поточної перевірки

Для встановлення додаткових параметрів відображення та фільтрації повідомлень ви можете передати шлях до файлу конфігурації діагностик (.pvsconfig) за допомогою аргументу '-c':

Збереження дампа моніторингу компіляції та запуск аналізу з дампа

CLMonitor.exe дозволяє зберегти відловлену інформацію про компіляцію в окремому дамп-файлі. Це дозволить надалі перезапустити аналіз без необхідності повторно збирати проект та моніторити цю збірку. Для збереження дампа моніторингу компіляції потрібно спочатку запустити моніторинг у звичайному режимі командами trace або monitor, як було описано вище. Після завершення зборки можна завершити моніторинг і зберегти файл дампа. Для цього потрібно запустити CLMonitor.exe із командою saveDump:

Також можна завершити моніторинг, зберегти файл дампа та запустити аналіз відловлених файлів. Це можна зробити, додатково вказавши команді CLMonitor.exe analyze шлях до місця збереження дампа:

Запустити аналіз із вже готового dump файлу можна без попереднього запуску моніторингу:

Файл дампа є звичайним zip архівом, що містить список відловлених у процесів параметрів (параметри запуску, поточна директорія, змінні оточення тощо) у форматі XML. Команда analyzeFromDump підтримує запуск як із архівованого zip дампа, так і з неупакованого XML файлу.

Використання системи відстеження компіляції із програми C and C++ Compiler Monitoring UI

Для "ручної" перевірки окремих проектів через CLMonitor можна скористатися інтерфейсом програми Compiler Monitoring UI, який можна запустити з меню Start.

Щоб запустити відстеження, відкрийте діалог через Tools -> Analyze Your Files. (малюнок 1):

моніторингу

Рисунок 1 - Діалог запуску моніторингу складання

Натисніть "Start Monitoring". Після цього буде запущено CLMonitor.exe, а основне вікно середовища буде згорнуто.

Виконайте складання, а після завершення натисніть на кнопку "Stop Monitoring" у вікні в правому нижньому кутку екрану (рисунок 2):

pvs-studio

Малюнок 2 - Діалог управління моніторингом

Якщо серверу моніторингу вдалося відстежити запуск компіляторів, буде запущено статичний аналіз вихідних файлів. Після закінчення ви отримаєте звичайний звіт про роботу PVS-Studio (рисунок 3):

pvs-studio

Рисунок 3 - Результати роботи сервера моніторингу та статичного аналізатора

Результати роботи можуть бути збережені у вигляді файлу XML (файла з розширенням plog) за допомогою команди меню File -> Save PVS-Studio Log As.

Використання системи відстеження компіляції з Visual Studio

Зручна навігація за повідомленнями аналізатора та навігації за кодом середовища доступна серед розробки Visual Studio за допомогою плагіна PVS-Studio. Якщо проект, що перевіряється, можна відкривати в Visual Studio, але при цьому "звичайна" перевірка (PVS-StudioCheckSolution) не працює (наприклад, це актуально для makefile проектів), можна використовувати переваги роботи з IDE, завантаживши отримані результати аналізу (plog файл) в PVS -Studio за допомогою команди (PVS-StudioOpen/SaveOpen Analysis Report.). Цю дію також можна автоматизувати за допомогою засобів автоматизації Visual Studio, прив'язавши її, а також саму перевірку, наприклад, до складання проекту. Наведемо як приклад інтеграцію аналізу з допомогою системи відстеження викликів компілятора PVS-Studio в makefile проект. Такий тип проектів, наприклад, використовується системою збирання Unreal Engine проектів на Windows.

Як команду запуску збірки впишемофайл run.bat:

pvs-studio

Малюнок 4 - налаштування складання makefile проекту

Вміст файлу run.bat:

Як параметри в run.bat ми передаємо шляхи до solution'а та проекту. Ми запускаємо відстеження запуску компіляторів за допомогою CLMonitor.exe. Команда waitfor потрібна для створення затримки між запуском відстеження компіляторів та запуском складання - без неї моніторинг може "не встигнути" відловити перші запуски компіляторів. Далі ми запускаємо складання проекту через nmake. Після завершення зборки ми запускаємо аналіз, і коли аналіз завершиться (результат аналізу буде записаний поруч із проектним файлом), ми завантажимо результати аналізу у Visual Studio за допомогою іншого скрипту - LoadPlog.vbs. Ось його вміст:

Тут ми використовуємо команду автоматизації Visual Studio DTE.ExecuteCommand для звернення з командного рядка до запущеного екземпляра Visual Studio, в якому відкрито наш проект. Фактично виконання цієї команди еквівалентно кліку по PVS-StudioOpen/SaveOpen Analysis Report.

Для пошуку запущеного екземпляра Visual Studio ми використовували метод GetObject. Зверніть увагу, що цей метод ідентифікує запущену Visual Studio по відкритому в ній solution'у - при його використанні не слід тримати відкритими кілька IDE з однаковими завантаженими solution'ами - він може "промахнутися", і результати аналізу відкриються не в тій IDE, якої ви запускали складання\аналіз.

Особливості моніторингу складання проектів у середовищі IAR Embedded Workbench for ARM

При складанні проекту в середовищі IAR Embedded Workbench, поточна робоча директорія процесу компілятора (iccarm.exe) в деяких випадках може бути встановлена ​​середовищем C:\Windows\System32. Така поведінка може викликати проблеми, оскільки CLMonitoring зберігаєпроміжні файли у поточній робочій директорії процесу компілятора.

Щоб уникнути запису проміжних файлів у C:\Windows\System32, а також помилок, пов'язаних з недостатніми правами для запису в C:\Windows\System32, необхідно відкривати робочий простір подвійним клацанням миші на файлі з розширенням eww з провідника Windows. У цьому випадку проміжні файли будуть збережені в директорії робочого простору.

Інкрементальний аналіз

У разі потреби інкрементального аналізу під час використання системи моніторингу компіляції, досить " відстежувати " инкрементальную складання, тобто. компіляцію файлів, які були змінені з моменту останнього складання. Цей сценарій використання дозволить аналізувати лише змінений/новий код.

Такий сценарій використання є природним для системи моніторингу компіляції. Відповідно, режим аналізу (повний або аналіз лише модифікованих файлів) залежить тільки від того, яке збирання відстежується - повне або інкрементальне.