Знакомство со статическим анализатором PVS-Studio при разработке C++ программ в среде Linux

    PVS-Studio поддерживает анализ проектов на языках C, C++, C# и Java. Использовать анализатор можно под системами Windows, Linux и macOS. В этой заметке речь пойдет об анализе кода, написанного на C и C++ в среде Linux.

    Установка


    Установить PVS-Studio под Linux можно разными способами, в зависимости от типа дистрибутива. Наиболее удобный и предпочтительный способ – использование репозитория: так это позволяет автоматически обновлять анализатор при выходе новых версий. Второй вариант – использовать установочный пакет, который можно скачать здесь.

    Команды, которые необходимо выполнить для установки, зависят от дистрибутива Linux, который вы используете. Например, для систем, основанных на Debian, установка из репозитория выглядит так:

    wget -q -O - https://files.viva64.com/etc/pubkey.txt | sudo apt-key add -
    
    sudo wget -O /etc/apt/sources.list.d/viva64.list \
    https://files.viva64.com/etc/viva64.list
    
    sudo apt update
    sudo apt install pvs-studio

    Чтобы установить PVS-Studio из установочного пакета, можно воспользоваться утилитой gdebi:

    sudo gdebi pvs-studio-VERSION.deb

    Более подробно процесс установки описан в разделе "Установка и обновление PVS-Studio в Linux" документации. Там же вы можете найти информацию о системах, не основанных на Debian.

    После установки нужно ввести лицензионные данные. Для этого используется команда

    pvs-studio-analyzer credentials NAME KEY [-o LIC-FILE]

    Где NAME и KEY – имя, на которое зарегистрирована лицензия, и лицензионный ключ. Необязательный параметр –o позволяет задать путь, по которому будет сгенерирован файл лицензии. По умолчанию он хранится в каталоге ~/.config/PVS-Studio/.

    Триальный ключ вы можете получить на странице "Скачать и попробовать PVS-Studio".

    Проверка проектов


    После установки анализатора можно приступать к проверке проектов. Для этого существуют два основных способа:

    1. Мониторинг компиляции;
    2. Запуск в процессе сборки непосредственно из сборочной системы.

    Рассмотрим сначала первый способ. Чтобы запустить мониторинг под Linux, понадобится утилита strace. Анализатор использует ее для сбора информации о том, какие процессы запускались во время сборки проекта.

    Запуск производится следующей командой:

    pvs-studio-analyzer trace -- make

    В этом примере используется сборка с помощью make, но на месте вызова make может стоять любая другая команда, которую вы используете, чтобы начать сборку. Параметры командной строки в нее можно передать обычным способом.

    После сборки strace создаст файл, который анализатор будет использовать для проверки исходного кода. Запустить анализ можно командой

    pvs-studio-analyzer analyze -o /path/to/project.log

    На выходе получится закодированный файл с результатами, который вы можете сконвертировать в один из поддерживаемых форматов. Работу с отчетами мы рассмотрим в следующем разделе.

    Кроме использования strace, анализ также можно запустить на основе файла compile_commands.json (JSON Compilation Database). Многие системы сборки позволяют экспортировать команды вызовов компилятора, или вы можете воспользоваться для этого утилитой BEAR. Запустить анализ в этом случае можно командой

    pvs-studio-analyzer analyze –f /path/to/compile_commands.json

    Следует отметить, что анализатор распознает используемый компилятор по имени его исполняемого файла. Если при проверке вы получаете ошибку «No compilation units found», попробуйте указать имя вашего компилятора через параметр –compiler или –c:
    pvs-studio-analyzer analyze -c MyCompiler

    Это может понадобиться при кросс-компиляции и использовании компиляторов с нестандартными именами исполняемых файлов.

    Кроме запусков в режиме мониторинга, вы можете интегрировать анализатор в вашу сборочную систему или IDE. Примеры проектов с уже настроенной интеграцией вы можете найти на GitHub в репозитории PVS_Studio:


    Более подробную инструкцию по запуску анализа под Linux смотрите в документации.

    Работа с отчетами


    После проверки проекта анализатор создает закодированный отчет. Для того, чтобы конвертировать его в один из поддерживаемых форматов, следует использовать утилиту plog-converter, которая устанавливается вместе с PVS-Studio.

    Утилита поддерживает следующие форматы:

    • xml – удобный формат для дополнительной обработки результатов анализа, поддерживается плагином для SonarQube;
    • csv – текстовый формат, предназначенный для представления табличных данных;
    • errorfile – формат вывода gcc и clang;
    • tasklist – формат ошибок, который можно открыть в QtCreator;
    • html – отчет html с кратким описанием результатов анализа;
    • fullhtml – отчет html с сортировкой результатов анализа по разных параметрам и навигацией по исходному коду.

    Для просмотра отчета наиболее удобен формат fullhtml, так как он позволяет перейти на строку исходного кода, в которой возникло предупреждение. Следующая команда позволяет сконвертировать отчет анализатора в этот формат:

    plog-converter -a GA:1,2 -t fullhtml /path/project.log -o /path/report_dir

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

    Обратите внимание на ключ -a. Он позволяет указать, какие именно предупреждения должны попасть в отчет. Это удобно, если есть необходимость отфильтровать вывод анализатора. Приведенная выше команда создаст отчет, который будет содержать только предупреждения из группы general analysis первого и второго уровней достоверности (High и Medium).

    Пример отчета:

    Picture 9


    По клику в ячейке Location сообщения можно перейти к соответствующей строке кода:

    Picture 8


    Клик по номеру диагностики в колонке Code откроет документацию с описанием этой диагностики.

    Подавление срабатываний анализатора


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

    Также при анализе старого кода может возникнуть необходимость массово подавить все сообщения. Как правило, это нужно для того, чтобы проверять только тот код, который добавляется в существующую кодовую базу. Для этого используется параметр suppress утилиты pvs-studio-analyzer.

    Массово подавить сообщения в отчете можно следующей командой:

    pvs-studio-analyzer suppress /path/to/report.log

    Информация о подавленных сообщениях хранится в файле suppress_base.json, который лежит рядом с проектом. Такие сообщения исключаются из отчета при последующих проверках.

    Подробнее этот механизм описан в документации здесь.

    Заключение


    Это было краткое введение в использование анализатора PVS-Studio под Linux. Надеюсь, оно было полезным и ответило на наиболее часто возникающие вопросы. Более подробно о теме статьи вы можете прочитать в документации здесь.



    Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Yuri Minaev. Getting Started with the PVS-Studio Static Analyzer for C++ Development under Linux.
    PVS-Studio
    Статический анализ кода для C, C++, C# и Java

    Комментарии 8

      +2

      Где-то между "хотелось-бы увидеть" и "советую написать" статью по использованию PVS с облачными CI-сервисами (Travis-CI, Circle-CI, AppVeyour). Я даже думал сам сделать (и могу помочь), но пока некогда.


      P.S.
      Covery-Scan болеет с начала этого года. Поэтому я попробую перевести свои проекты на PVS. Ну и по-результатам запилить статейку.

        +1
        Недавно мы опубликовали статью "PVS-Studio идёт в облака – запуск анализа на Travis CI". И скоро будут ещё статьи в том же ключе.
          0
          А плагин Jenkins для Linux еще не подвезли? А то очень ждём. И, пользуясь случаем, переведите пожалуйста ваши RPM repo на https, а то MITM никто не отменял и будет невесело если кто-то подменит анализатор на свой троян. А еще лучше, если будут подписанные RPM пакеты.
          $ wget https://files.viva64.com/etc/viva64.repo
          $ cat viva64.repo 
          [viva64]
          name=Viva64
          baseurl=http://files.viva64.com/rpm
          gpgcheck=0
          enabled=1
          
            +1
            А плагин Jenkins для Linux еще не подвезли?


            Концепция изменилась. В следующем релизе будет поддержка warnings-ng-plugin для Jenkins, которая будет во всех операционках работать.

            Желающие могут написать нам и поучаствовать в бета-тестировании.
        +1
        Что с C# на Linux?
          +1
          Пока спроса нет.
          +1
          день добрый, команда разработчиков PVS-Studio.
          заметил, что вы время от времени берете какой нибудь проект с открытым исходным кодом, анализируете его на ошибки и пишите статью с разбором ошибок и публикуете статью на хабре.
          это и помощь разработчикам и реклама для вашего продукта.

          прошу обратить ваше внимание на проект с открытым исходным кодом shareaza
          это бесплатный клиент для обмена файлами по протоколу gnutela, emule, bittorrent, dc++.
          создается командой добровольцев и как всегда содержит ошибки.
          вот ссылка на активно разрабатываемый форк shareaza
          github.com/ivan386/Shareaza/releases
          к сожалению, разработчик использует visual studio 2008, которая не совместима с PVS-Studio и разработчик не имеет возможности использовать более современную среду разработки.
          (возможно разработчик зарегистрирован на хабре под тем же ником).

          прошу рассмотреть возможность проанализировать этот проект на предмет ошибок, написать статью об этом на хабре.
          так же подумать о внедрении совместимости PVS-Studio с visual studio 2008.

          зарание благодарен за любой ответ.
            0
            Проект запишем. Поддержка плагина для Visual Studio 2008 закончилась уже несколько лет назад и возращение её не планируется.

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое