Вебинар: Стратегия без иллюзий: как превращать цели в результаты - 19.08
В этой документации представлена работа с анализатором PVS-Studio для Go c использованием командной строки.
Помимо CLI, PVS-Studio предоставляет интеграцию с GoLand и Visual Studio Code. Подробнее описано в соответствующих документациях:
Установка анализатора описана в отдельной документации.
Перед началом использования анализатора необходимо активировать лицензию. Ввод лицензии описан в отдельной документации.
Утилита имеет два режима работы:
analyze — утилита выполняет анализ переданного проекта;suppress — утилита выполняет генерацию файла подавления.Для получения информации обо всех доступных аргументах и флагах, необходимо выполнить команды:
pvs-golang --helppvs-golang analyze --helppvs-golang suppress --helpДля запуска анализа проекта нужно воспользоваться командой analyze и передать путь до директории с Go проектом:
pvs-golang analyze /path/to/project
По итогам выполнения анализа утилита сохранит отчёт в текущей рабочей директории с именем PVS-Studio.json и вернёт код возврата.
Режим analyze имеет один аргумент — директория с проектом.
Ниже представлены флаги режима analyze.
Определяет поведение анализатора на указанных путях. Принимает строку следующего формата:
(mode=<path>|<glob>)(,mode=<path>|<glob>)*
где mode — поведение анализатора на указанном пути <path> или glob-паттерне <glob>. Допустимые режимы:
analyze — анализатор проведёт анализ файлов, соответствующих указанному пути или glob-паттерну;skip-analysis — анализатор уберёт из анализа файлы, соответствующие указанному пути или glob-паттерну.Анализатор всегда изначально предполагает, что все исходные файлы должны быть проверены (analyze=*), даже при явной передаче флага. Флаг может быть задан несколько раз, анализатор последовательно применит все указанные фильтры.
Например, нужно исключить из анализа директории 3rd-party и unittests, но включить в анализ поддиректорию 3rd-party/lib1:
pvs-golang analyze /path/to/project \
--analysis-paths "skip-analysis=*/3rd-party/*" \
--analysis-paths "skip-analysis=*/unittests/*" \
--analysis-paths "analyze=*/3rd-party/lib1/*"
Активирует проверку списка файлов. Позволяет решить задачу автоматической проверки коммитов и Pull/Merge Requests на стороне CI/CD.
В качестве аргумента принимает файл со списком путей или glob-паттернов, которые необходимо проанализировать. Каждый путь или glob-паттерн должен быть записан отдельной строкой, например:
# content of the file
src/source1.go
src/source2.go
Если файл содержит относительные пути, то они будут раскрыты в абсолютные через текущую рабочую директорию.
Пример:
pvs-golang analyze /path/to/project \
--source-files fromCommit.txt
Путь до результирующего отчёта анализатора. Расширение файла, переданного в качестве аргумента, не влияет на формат содержимого отчёта.
Если необходимо выдать результат в stdout, то нужно передать символ - как аргумент флага.
Если флаг не передан, то по умолчанию отчёт запишется в текущей рабочей директории с именем PVS-Studio.json.
Пример:
pvs-golang analyze /path/to/project \
--output report.json
Позволяет задать конфигурацию анализа через файл в формате TOML. Более подробно об этом способе настройки анализатора написано в отдельной документации.
По умолчанию, утилита ищет файл pvs-settings.toml в директории, указанной для анализа.
Пример:
cd /path/to/project
pvs-golang analyze . \
--analysis-config project-settings.toml
Задаёт количество потоков для анализа. Представляет собой целое, неотрицательное число.
Если в качестве аргумента передано значение 0, то анализ будет распараллелен на все доступные логические ядра.
Если флаг не указан, то по умолчанию утилита распараллеливает работу на оптимальное количество потоков для анализа.
Пример:
pvs-golang analyze /path/to/project \
--threads 8
Определяет время, через которое будет остановлен анализ единичного файла (таймаут).
Представляет собой строку формата XXhYYmZZs.
Если флаг не указан, то по умолчанию утилита останавливает анализ единичного файла через 10 минут.
Пример установки таймаута на 30 минут:
pvs-golang analyze /path/to/project \
--file-analysis-timeout 30m
Позволяет генерировать переносимые между машинами отчёты. Представляет собой путь до директории, который будет заменяться в позициях предупреждений на специальный маркер |?|.
Пример:
pvs-golang analyze /path/to/project \
--source-tree-root /path/to/project
Позволяет управлять состоянием диагностических правил — включены (on) или выключены (off).
Принимает строку следующего формата:
(RULE|RANGE|GROUP)=(on|off)(,(RULE|RANGE|GROUP)=(on|off))*
где:
RULE — диагностическое правило, которое записывается в формате Vxxxx. Списки диагностических правил доступны здесь: [1] и [2].RANGE — закрытый диапазон диагностических правил, который записывается в формате Vxxxx-Vyyyy. Число xxxx должно быть меньше yyyy.GROUP — группа диагностических правил. Доступные группы:ALL — все диагностические правила.GA — диагностические правила общего назначения.OWASP — диагностические правила для обнаружения отклонений от OWASP ASVS.Анализатор всегда изначально предполагает, что включена только группа диагностических правил общего назначения (GA=on), даже при явной передаче флага. Флаг может быть задан несколько раз: анализатор последовательно применит все указанные фильтры.
Пример отключения всех правил и включение только правил V8001–V8031:
pvs-golang analyze /path/to/project \
--rules ALL=off \
--rules V8001-V8031=on
Включает добавление SEC-меток в поле SAST предупреждений анализатора. SEC-метки отображают группы срабатываний анализатора согласно классификации критических ошибок из ГОСТ Р 71207-2024.
Пример:
pvs-golang analyze /path/to/project \
--security-related-issues
При указании флага, утилита возвращает код 1, если отчёт содержит предупреждения после успешного завершения анализа.
Пример:
pvs-golang analyze /path/to/project \
–-indicate-warnings
Позволяет не выдавать в результатах анализа предупреждения низкого уровня достоверности.
Пример:
pvs-golang analyze /path/to/project \
–-no-noise
Задаёт пути до файлов подавления предупреждений анализатора.
Если флаг не указан, то по умолчанию утилита неявно ищет файл с названием suppress_file.suppress.json в директории анализа.
Флаг может быть задан несколько раз: анализатор читает все указанные файлы подавления.
Пример:
pvs-golang analyze /path/to/project \
--suppress-files /path/to/project/file1.suppress.json \
--suppress-files /path/to/project/file2.suppress.json
Позволяет отключить проверку об истечении срока лицензии. Если до окончания лицензии остаётся менее 30 дней, без указания флага утилита возвращает код 21 и записывает сообщение.
Пример:
pvs-golang analyze /path/to/project \
--disable-license-expiration-check
Позволяет игнорировать ненулевой код возврата при следующих некритичных ошибках:
Пример:
pvs-golang analyze /path/to/project \
--ignore-analysis-failures
Позволяет задать произвольный путь до файла, содержащего информацию о лицензии. На Windows лицензия должна содержаться в Settings.xml файле, на Linux/macOS — в файле PVS-Studio.lic.
Если флаг не указан, то по умолчанию утилита ищет лицензию, которая была введена стандартным способом на Windows или Linux/macOS.
Пример:
pvs-golang analyze /path/to/project \
--license-file /path/to/project/PVS-Studio.lic
Режим suppress производит подавление предупреждений на основе переданных отчётов анализа. Предупреждения, которые генерирует анализатор и которые соответствуют подавленным, не попадут в отчёт при следующих проверках проекта. Более подробно об этом механизме написано в отдельной документации.
Режим принимает пути до отчётов анализа. Подавленные предупреждения по умолчанию записываются в текущую рабочую директорию в файл с именем suppress_file.suppress.json. Расположение файла может быть изменено соответствующим флагом, который будет описан ниже. Если файл ранее существовал, то утилита дополнит его новыми предупреждениями.
Пример:
pvs-golang suppress /path/to/project/module1.report.json
/path/to/project/module2.report.json
Ниже представлены флаги режима suppress.
Путь до результирующего файла подавления.
При попытке передачи пути до директории в качестве аргумента будет выдана ошибка.
Если файл ранее существовал и является файлом подавления, то утилита дополнит его новыми предупреждениями.
Если необходимо выдать результат в stdout, то нужно передать символ - как аргумент флага.
Пример:
pvs-golang suppress /path/to/project/report.json \
--output /path/to/project/project.suppress.json
0 — анализ успешно завершён.1 — анализ успешно завершён и результирующий отчёт содержит предупреждения. Этот код будет возвращен только при использовании флага --indicate-warnings.2 — обнаружена некорректная конфигурация анализатора, заданная через интерфейс командной строки или файлы конфигурации.3 — при работе утилиты возникла непредвиденная ошибка. Обычно это сигнализирует о наличии ошибки в коде самой утилиты и сопровождается выведением дополнительной информации в stderr. Если вам встретилась такая ошибка, пожалуйста, отправьте эту информацию нам через форму обратной связи.4 — все файлы были исключены из анализа.5 — имеются файлы, которые не удалось проанализировать (например, произошла ошибка парсинга).6 — имеются файлы, анализ которых был прерван по таймауту.20 — истёк срок действия лицензии.21 — срок действия лицензии истечёт через месяц.22 — лицензия отсутствует или невалидна.0 — предупреждения из всех переданных отчетов были успешно подавлены.1 — часть предупреждений из переданных отчетов не была подавлена из-за некритичной ошибки.2 — были указаны некорректные входные данные.3 — при работе утилиты возникла непредвиденная ошибка. Обычно это сигнализирует о наличии ошибки в коде самой утилиты и сопровождается выведением дополнительной информации в stderr. Если вам встретилась такая ошибка, пожалуйста, отправьте эту информацию нам через форму обратной связи.