Фильтрация и обработка вывода анализатора при помощи файлов конфигурации диагностик (.pvsconfig)
- Добавление/использование файлов конфигурации в IDE и других инструментах анализа
- Использование .pvsconfig в Visual Studio
- Использование .pvsconfig файла в CLion
- Использование .pvsconfig файла в Rider
- Использование .pvsconfig в PVS-Studio_Cmd.exe и pvs-studio-dotnet
- Использование .pvsconfig в CLMonitor.exe
- Использование .pvsconfig в CompilerCommandsAnalyzer.exe
- Использование .pvsconfig в Standalone.exe
- Использование глобального файла .pvsconfig
- Общий функционал файлов конфигурации
- Добавление записей в файл конфигурации
- Фильтрация срабатываний анализатора
- Исключение файлов из анализа
- Исключение проектов из анализа
- Игнорирование файлов конфигурации
- Изоляция настроек для каталогов
- Игнорирование глобальных файлов конфигурации
- Указание timeout-а анализа файлов для проекта/solution/системы
- Изменение уровня срабатываний диагностики
- Изменения текста сообщений анализатора
- Управление синхронизацией suppress файлов
- Выбор версии PVS-Studio для анализа
- Приоритезация файлов конфигурации
- Выполнение команд из CustomBuild task перед анализом
- Подавление ошибок парсинга
- Игнорирование настроек анализа из Settings.xml
- Использование каталога решения в качестве значения SourceTreeRoot
- Использование каталога решения для построения относительных путей в кэше зависимостей компиляции
- Управление сортировкой suppress файлов
- Секции настроек в .pvsconfig
- Обнаружение начальной позиции сдвига строк (для V002)
- Управление кэшем зависимостей компиляции
- Режим отслеживания исходных файлов в кэше зависимостей
- Разметка предупреждений, связанных с потенциальными проблемами безопасности
Файл конфигурации служит для отображения и фильтрации сообщений анализатора. Также в нём можно задать дополнительные настройки анализа. Использование данных файлов возможно только для проектов, написанных на C, C++ или C#.
Файлы конфигурации поддерживаются плагинами для следующих IDE:
- Visual Studio;
- Rider.
Утилиты, поддерживающие файлы конфигурации:
PVS-Studio_Cmd.exe
;CLMonitor.exe
(только в режимеanalyze
илиanalyzeFromDump
);- C and C++ Compiler Monitoring UI (
Standalone.exe
); CompileCommandsAnalyzer.exe
(в режимеanalyze
).
Добавление/использование файлов конфигурации в IDE и других инструментах анализа
Использование .pvsconfig в Visual Studio
Для использования файла конфигурации в Visual Studio необходимо добавить его на уровне проекта или решения. Для этого выделите интересующий проект или решение в окне Solution Explorer среды Visual Studio. Выберите пункт контекстного меню Add New Item... . В появившемся окне выберите тип файла PVS-Studio Filters File.

Если шаблона нет, то вы можете просто добавить в проект или решение обычный текстовый файл с расширением .pvsconfig
.
Для каждого проекта/решения можно добавить несколько файлов конфигурации.
Добавление строки //DISABLE_ANALYSIS_AFTER_BUILD
в файл .pvsconfig
уровня решения скроет меню Analysis After Build (Modified Files Only)
и отключит инкрементальный анализ для соответствующего решения. Это сработает при повторном открытии решения.
Использование .pvsconfig файла в CLion
Специального шаблона для добавления файла конфигурации для CLion нет.
Добавить файл конфигурации для CLion можно только на уровне проекта. Чтобы использовать его в CLion, добавьте в папку .PVS-Studio
новый файл с расширением .pvsconfig
через контекстное меню New > File.

Использование .pvsconfig файла в Rider
Специального шаблона для добавления файла конфигурации для Rider нет.
Добавить файл конфигурации для Rider можно только на уровне проекта. Чтобы использовать файл конфигурации диагностик в Rider, добавьте в проект новый файл с расширением .pvsconfig
через Solution Explorer.

Использование .pvsconfig в PVS-Studio_Cmd.exe и pvs-studio-dotnet
При анализе через PVS-Studio_Cmd.exe
или pvs-studio-dotnet
автоматически используются файлы конфигурации из анализируемого проекта или решения. Также можно передать путь к дополнительному файлу .pvsconfig
с помощью параметра ‑‑rulesConfig (-C)
:
PVS-Studio_Cmd.exe -t ProjName.sln -C \path\to\.pvsconfig
pvs-studio-dotnet -t ProjName.sln -C /path/to/.pvsconfig
В этом случае при анализе учитываются настройки и из файлов в проекте/решении, и из файла, переданного в качестве аргумента.
Использование .pvsconfig в CLMonitor.exe
Путь к файлу конфигурации необходимо передать в качестве аргумента командной строки (параметр -c
):
CLMonitor.exe analyzeFromDump -d /path/to/compileDump.gz -c /path/to/.pvsconfig
Использование .pvsconfig в CompilerCommandsAnalyzer.exe
Если вы используете утилиту CompilerCommandsAnalyzer.exe
, то можете передать путь до .pvsconfig
файла через параметр -R
:
CompilerCommandsAnalyzer.exe analyze ... -R /path/to/.pvsconfig
Использование .pvsconfig в Standalone.exe
В Standalone.exe
вы можете указать путь к файлу при запуске мониторинга.

Использование глобального файла .pvsconfig
Глобальный файл конфигурации диагностик используется при проверке всех проектов. Таких файлов конфигурации .pvsconfig
может быть несколько, и все они будут использованы инструментами PVS-Studio.
Для добавления глобального файла конфигурации создайте файл с расширением .pvsconfig
в папке:
- Для Windows:
%APPDATA%\PVS-Studio
; - Для Linux и macOS:
~/.config/PVS-Studio
.
Общий функционал файлов конфигурации
Добавление записей в файл конфигурации
Задание настроек в файлах конфигурации производится при помощи специальных директив, начинающихся с символов //
. Каждая директива пишется с новой строки.
Пример:
//-V::122
//-V::123
Также существует возможность добавлять комментарии. Для этого необходимо написать символ #
в начало строки.
Пример:
# I am a comment
Фильтрация срабатываний анализатора
Отключение отдельных диагностик
Для полного отключения определённой диагностики используется запись:
//-V::number
number
— номер диагностики, которую нужно выключить (например, 3022).
Пример использования:
//-V::3022
В данном случае будут игнорироваться срабатывания диагностики V3022.
Для отключения нескольких диагностик перечислите номера через запятую:
//-V::number1,number2,...,numberN
Пример:
//-V::3022,3080
При использовании этой директивы будут полностью отключены диагностики V3022 и V3080.
Отключение диагностик из определённых категорий
Для отключения диагностик некоторой категории используются следующие директивы:
//-V::GA
//-V::X64
//-V::OP
//-V::CS
//-V::MISRA
//-V::OWASP
Пояснение для каждой из категорий:
- GA (General Analysis) — диагностики общего плана. Основной набор диагностических правил PVS-Studio;
- OP (Optimization) — диагностики оптимизации. Указания по повышению эффективности;
- X64 (64-bit) — диагностики, позволяющие выявлять специфические ошибки, связанные с разработкой 64-битных приложений, а также переносом кода с 32-битной на 64-битную платформу;
- CS (Customers' Specific) — узкоспециализированные диагностики, разработанные по просьбам пользователей. По умолчанию этот набор диагностик отключен;
- MISRA — диагностики, разработанные в соответствии со стандартом MISRA (Motor Industry Software Reliability Association). По умолчанию этот набор диагностик отключен;
- OWASP — диагностики, направленные на поиск проблем с безопасностью и проверяющие соответствие кода стандарту OWASP ASVS. По умолчанию отключено.
Можно комбинировать фильтры категорий, перечисляя их через запятую.
Пример комбинации:
//-V::GA,MISRA
Отключение всех C++ или C# диагностик
Для отключения всех диагностик C++ или C# анализатора используются директивы:
//-V::C++
//-V::C#
Исключение предупреждений определённого уровня
Если требуется исключить срабатывания определённого уровня, используйте запись вида:
//-V::number1,number2,...,numberN:level
number1
,number2
и т.д. — номера диагностик, срабатывания которых нужно исключить (например, 3022).level
— уровень предупреждения (1, 2 или 3).
Цифре 1 соответствуют срабатывания уровня High, цифре 2 — Medium', цифре 3 — Low.
Можно исключать предупреждения сразу нескольких уровней. Для этого нужно написать уровни через запятую.
Пример:
//-V::3022,5623:1,3
Эта запись позволит исключить срабатывания диагностик V3022 и V5623 уровня High и Low.
Исключение предупреждений по подстроке в сообщении
Анализатор поддерживает возможность исключения предупреждений по номеру диагностики и подстроке, содержащейся в сообщении.
Запись для подавления:
//-V::number::{substring}
number
— номер диагностики, сообщение которой нужно подавить (например, 3080).substring
— подстрока, содержащаяся в сообщении анализатора.
При использовании такого шаблона будут игнорироваться срабатывания диагностик с номером number
, сообщения которых содержат подстроку substring
.
Пример подавления по подстроке:
//-V::3022::{always true}
В данном случае будут отключены срабатывания V3022, в сообщении которых есть подстрока 'always true'.
Исключение предупреждений по уровню и подстроке в сообщении
Также можно добавить фильтрацию по уровню и подстроке. Такая запись будет иметь вид:
//-V::number1,number2,...,numberN:level:{substring}
number1
,number2
и т.д. — номера диагностик, срабатывания которых нужно исключить (например, 3022).level — уровень предупреждения (1, 2 или 3).
substring
— подстрока, содержащаяся в сообщении анализатора.
Цифре 1 соответствуют срабатывания уровня High, цифре 2 — Medium, цифре 3 — Low.
Можно исключать предупреждения диагностик сразу нескольких уровней. Для этого нужно написать уровни через запятую.
Пример:
//-V::3022,5623:1,3:{always true}
Будут исключены срабатывания уровня High и Low диагностик V3022, V5623, в сообщении которых есть подстрока always true
.
Исключение предупреждений из определённых категорий по уровням
Для исключения предупреждений некоторых категорий по уровням используется запись вида:
//-V::category1,category2,...,categoryN:level
category1
,category2
и т. д. — имена категорий, срабатывания которых нужно исключить (например, GA). Перечень категорий и их описание можно найти в разделе Отключение диагностик из определённых категорий этой документации;level
— уровень предупреждения (1, 2 или 3).
Можно комбинировать фильтры категорий и уровней, перечисляя их через запятую.
Пример комбинации:
//-V::GA,MISRA:1,3
Будут исключены срабатывания уровня High и Low диагностик, которые относятся к категориям GA и MISRA.
Включение отдельных диагностик
Примечание: Данная настройка доступна только для C, С++ и C# проектов.
Для включения определённой диагностики используется запись:
//+V::number
number
— номер диагностики, которую нужно включить (например, 3022).
Пример использования:
//+V::3022
В данном случае будут включены срабатывания диагностики V3022.
Для включения нескольких диагностик перечислите номера через запятую:
//+V::number1,number2,...,numberN
Пример:
//+V::3022,3080
При использовании этой директивы будут полностью включены диагностики V3022 и V3080.
Включение диагностик из определённых категорий
Примечание: Данная настройка доступна только для C, С++ и C# проектов.
Для включения диагностик некоторой категории используются следующие директивы:
//+V::GA
//+V::X64
//+V::OP
//+V::CS
//+V::MISRA
//+V::OWASP
Можно комбинировать фильтры категорий, перечисляя их через запятую.
Пример комбинации:
//+V::GA,MISRA
Добавление метки False Alarm для срабатываний на строки, содержащие указанный фрагмент
Добавление False Alarm метки для предупреждений на строки с некоторым фрагментом производится с помощью следующей директивы:
//-V:substring:number
substring
— подстрока, содержащаяся в строке, на которую указывает анализатор;number
— номер диагностики, сообщение которой нужно подавить (например, 3080).
Примечание 1. Искомая подстрока (substring
) не должна содержать пробелов.
Примечание 2. Сообщения, отфильтрованные данным способом, не будут удалены из отчёта. Они будут отмечены как False Alarm (FA).
Пример использования:
public string GetNull()
{
return null;
}
public void Foo()
{
string nullStr = GetNull();
Console.WriteLine(nullStr.Length);
}
На данный код анализатор выдаст предупреждение: "V3080 Possible null dereference. Consider inspecting 'nullStr'."
Для добавления FA-метки для срабатываний на такой код используйте в .pvsconfig
следующую запись:
//-V:Console:3080
Такая директива добавит отметку False Alarm на все предупреждения V3080, указывающие на строку кода, в которой есть Console
.
Аналогичным образом можно добавлять отметку False Alarm на срабатывания сразу нескольких диагностик. Для этого перечислите их номера через запятую:
//-V:substring:number1,number2,...,number
Пример:
//-V:str:3080,3022,3175
Сообщения диагностик V3080, V3082, V3175 будут помечены как False Alarm, если в строке, на которую указывает анализатор, есть подстрока str
.
Добавления хэш-кода к метке False Alarm
С PVS-Studio версии 7.28 появилась возможность ставить дополнительный хэш-код к метке False Alarm. При изменении строки с этим хэш-кодом предупреждения, выданные на эту строку, не будут отмечены как ложные срабатывания, так как хэш-код изменённой строки отличается от хэш кода метки.
Эта настройка помогает распознавать ситуации, когда строка с меткой False Alarm изменяется.
Для включения этой функции добавьте в файл конфигурации следующий флаг:
//V_ENABLE_FALSE_ALARMS_WITH_HASH
В коде метка False Alarm c хэш-кодом выглядит следующим образом:
//-V817 //-VH"3652460326"
С версии PVS-Studio 7.30 появилась возможность для подавления только тех сообщений, к False Alarm метке которых поставлен дополнительный хэш-код:
//V_HASH_ONLY ENABLE
//V_HASH_ONLY ENABLE_VERBOSE
В случае применения данной настройки те строчки, которые имеют метку False Alarm, но не имеют хэш-кода, не будут подавлены.
Настройка ENABLE
приведёт к попаданию одного на весь проект сообщения V018 в отчёт. В случае применения настройки ENABLE_VERBOSE
такое предупреждение будет выдаваться на каждую строчку кода, в которой присутствует метка False Alarm без хэш-кода.
Выключение настройки выполняется следующим образом:
//V_HASH_ONLY DISABLE
Данная ситуация может возникнуть в случае, если применение данной настройки необходимо только на определённой части кода.
Исключение файлов из анализа
Для исключения из анализа файла или группы файлов используйте шаблон:
//V_EXCLUDE_PATH fileMask
'fileMask' — маска файла.
Пример использования некоторых масок:
//V_EXCLUDE_PATH C:\TheBestProject\thirdParty
//V_EXCLUDE_PATH *\UE4\Engine\*
//V_EXCLUDE_PATH *.autogen.cs
Начиная с версии 7.34 PVS-Studio можно использовать шаблон //V_ANALYSIS_PATHS
с режимом skip-analysis
.
Например:
//V_ANALYSIS_PATHS skip-analysis=C:\TheBestProject\thirdParty
//V_ANALYSIS_PATHS skip-analysis=*\UE4\Engine\*
//V_ANALYSIS_PATHS skip-analysis=*.autogen.cs
С синтаксисом формирования масок можно ознакомится в документации.
Исключение проектов из анализа
Начиная с версии 7.32, утилита PVS-Studio_Cmd.exe
и плагин для Visual Studio поддерживают исключение из анализа проектов по шаблону:
//V_EXCLUDE_PROJECT projMask
projMask
— маска файла проекта.
Пример использования некоторых масок:
//V_EXCLUDE_PROJECT C:\TheBestProject\thirdParty\3rdparty.vcxproj
//V_EXCLUDE_PROJECT *\TOCSharp.csproj
//V_EXCLUDE_PROJECT *\elsewhere\*.*proj
Синтаксис формирования масок совпадает с синтаксисом, используемым для исключения файлов из анализа. Исключить из проверки можно только .vcxproj
и .csproj
проекты.
Также вы можете исключить проект из анализа, указав аналогичный путь для флага //V_EXCLUDE_PATH
.
Игнорирование файлов конфигурации
Примечание: Данная настройка доступна только для C и С++ проектов.
Начиная с версии 7.34 PVS-Studio поддерживает возможность игнорировать настройки, которые находятся в исходных файлах и файлах конфигурации диагностик '.pvsconfig'.
Для этого можно использовать флаг //V_ANALYSIS_PATHS
с режимом skip-settings
.
Например:
//V_ANALYSIS_PATHS skip-settings=*\path\to\folder\*
//V_ANALYSIS_PATHS skip-settings=*\path\*\custom_pvsconfig
//V_ANALYSIS_PATHS skip-settings=*custom_settings.h
Если необходимо исключить файлы из анализа и одновременно игнорировать настройки для этих файлов, можно использовать флаг //V_ANALYSIS_PATHS
с режимом skip
.
Например:
//V_ANALYSIS_PATHS skip=*\path\to\source_or_pvsconfig
С синтаксисом формирования масок можно ознакомится в документации.
Изоляция настроек для каталогов
Примечание: данная настройка доступная только при использовании утилиты pvs-studio-analyzer
.
Начиная с версии 7.36, утилита pvs-studio-analyzer
поддерживает режим, при котором в каждом каталоге (и его родительских каталогах) для каждой единицы трансляции выполняется поиск файлов конфигурации правил (.pvsconfig
). Каждый найденный файл *.pvsconfig
будет применён для всех единиц трансляции в каталоге и его подкаталогах. Для включения этого режима следует воспользоваться флагом командной строки ‑‑apply-pvs-configs
. Подробнее об этом можно узнать в документации по утилите pvs-studio-analyzer
.
Вы можете изолировать настройки в каталоге от настроек из родительских директорий. Это полезно, если вам необходимо отделить настройки в подпроектах или third-party библиотеках. В таком случае никакие файлы конфигурации правил из родительских каталогов не будут применены для указных директорий и их подкаталогов.
Для изоляции настроек с помощью файла конфигурации правил есть два способа:
- через флаг
V_ANALYSIS_PATHS
с режимомisolate-settings
. Данную опцию можно указать в любом файле конфигураций правил. Поддерживаются абсолютные и относительные пути. Относительные пути раскрываются через путь до файла конфигураций правил, например:
//V_ANALYSIS_PATHS isolate-settings=path/to/isolate;isolate-settings=ThirdParty
- через флаг
//V_ISOLATE_CURRENT_DIR
. Включает изоляцию каталога, в котором расположен файл конфигурации с данным флагом.
Игнорирование глобальных файлов конфигурации
Перед запуском анализа PVS-Studio_Cmd
формирует конфигурацию диагностических правил из:
- глобальных файлов конфигурации (в папке
%APPDATA%\PVS-Studio
для Windows и в папке~/.config/PVS-Studio
для Linux и macOS); - файла, переданного через опцию
‑‑rulesConfig (-C)
; - файлов, добавленных в решение;
- файлов, добавленных в проект.
Может возникнуть ситуация, когда глобальная конфигурация не должна применяться при анализе каких-либо проектов или решений. Для её отключения добавьте в соответствующий файл конфигурации следующий флаг:
//IGNORE_GLOBAL_PVSCONFIG
Начиная с версии 7.36, этот флаг поддерживается и в pvs-studio-analyzer
.
Указание timeout-а анализа файлов для проекта/solution/системы
При запуске анализа через интерфейс плагинов (Visual Studio, Rider и CLion) или в C and C++ Compiler Monitoring UI (Standalone.exe) имеется возможность указания timeout-а по истечению которого анализ файла будет прерван. При превышении timeout-а анализа в результаты анализа будет добавлено предупреждение V006 с информацией о том, на каком файле был превышен timeout.
Настройки timeout-а анализа файлов можно указать и в .pvsconfig
. Например, этой строчкой указывается timeout в 10 минут (600 секунд):
//V_ANALYSIS_TIMEOUT 600
Если в .pvsconfig
указана строка с timeout-ом равным 0, то файлы будут анализироваться без ограничения по времени.
Благодаря настройке timeout-ов через .pvsconfig
файлы разных уровней, можно ограничить время анализа файлов в определенных проектах, solution-ах или во всей системе.:
- аргумент
‑‑rulesConfig (-c)
вPVS-Studio_Cmd.exe
(переопределяет timeout анализа файлов для текущего анализа solution/проекта); - системный (
%AppData% в Windows, ~/.config в Linux, macOS
); - solution (
.sln
); - уровень проекта (
.csproj
,.vcxproj
).
Изменение уровня срабатываний диагностики
Предупреждения анализатора имеют три уровня достоверности: High, Medium, Low. В зависимости от используемых в коде конструкций анализатор оценивает достоверность предупреждений и присваивает им соответствующий уровень в отчёте.
В некоторых проектах поиск определённых типов ошибок может быть очень важен, независимо от степени достоверности предупреждения. Бывает и обратная ситуация, когда сообщения малополезны, но совсем их отключать не хочется. В таких случаях для диагностик можно вручную задать уровень High/Medium/Low. Для этого следует использовать следующие директивы:
- Директива
//V_LEVEL_1
изменяет уровень срабатываний на High; - Директива
//V_LEVEL_2
изменяет уровень срабатываний на Medium; - Директива
//V_LEVEL_3
изменяет уровень срабатываний на Low.
Для изменения уровня используйте директиву следующего вида:
//V_LEVEL_1::number
number
— номер диагностики.
Например, чтобы изменить уровень предупреждений для диагностики V3176 на третий, используйте запись:
//V_LEVEL_3::3176
Изменения текста сообщений анализатора
Для изменения подстроки в сообщении анализатора используйте следующий синтаксис:
//+Vnnn:RENAME:{originalString:replacementString}, ...
Vnnn
— название диагностики, сообщение которой необходимо модифицировать (например, V624);originalString
— исходная подстрока;replacementString
— строка на которую нужно заменить.
Разберём работу директивы на примере. Диагностика V624, встречая в коде число 3.1415, предлагает заменить его на M_PI
из библиотеки <math.h>
. Но в проекте используется специальная математическая библиотека, и нужно использовать математические константы именно из неё. Для корректной работы следует добавить директиву в файл конфигурации.
Эта директива будет иметь следующий вид:
//+V624:RENAME:{M_PI:OUR_PI},{<math.h>:"math/MMath.h"}
Теперь анализатор сообщит, что нужно использовать константу OUR_PI
из заголовочного файла math/MMath.h
.
Существует возможность добавить строку к сообщению.
Директива, позволяющая сделать это, имеет следующий вид:
//+Vnnn:ADD:{message}
Vnnn
— название диагностики, сообщение которой необходимо модифицировать (например, V2003);message
— строка для добавления;
Разберём пример. Для этого рассмотрим сообщение диагностики V2003: "Explicit conversion from 'float/double' type to signed integer type.".
Чтобы добавить дополнительную информацию в это сообщение, нужно использовать директиву следующего вида:
//+V2003:ADD:{ Consider using boost::numeric_cast instead.}
Теперь анализатор будет выдавать модифицированное сообщение: "Explicit conversion from 'float/double' type to signed integer type. Consider using boost::numeric_cast instead.".
Управление синхронизацией suppress файлов
При запуске анализа через интерфейс плагина Visual Studio или в C and C++ Compiler Monitoring UI (Standalone.exe) имеется возможность отключить синхронизацию suppress файлов с помощью настройки Specific Analyzer Settings/DisableSynchronizationOfSuppressFiles.
Отключить синхронизацию также можно через .pvsconfig
файл уровня решения. Для этого необходимо добавить в соответствующий конфигурационный файл следующий флаг:
//DISABLE_SUPPRESS_FILE_SYNC
Для включения синхронизации через .pvsconfig
независимо от значения настройки DisableSynchronizationOfSuppressFiles необходимо использовать флаг:
//ENFORCE_SUPPRESS_FILE_SYNC
Этот флаг применим только в .pvsconfig
уровня решения.
Выбор версии PVS-Studio для анализа
Начиная с версии 7.24 утилита PVS-Studio_Cmd.exe
и плагин для Visual Studio поддерживают возможность указать версию ядра PVS-Studio для анализа C++ проектов, если на компьютере установлено несколько версий PVS-Studio.
Начиная с версии 7.36 утилита PVS-Studio_Cmd.exe
и плагин для Visual Studio поддерживают возможность указать версию ядра PVS-Studio для анализа C# проектов, если на компьютере установлено несколько версий PVS-Studio.
Для того, чтобы PVS-Studio_Cmd.exe
запускал анализ на нужной версии ядра PVS-Studio необходимо в файл .pvsconfig
уровня решения добавить флаг //PVS_VERSION::Major.Minor
, где
Major — мажорное число версии, а Minor — минорное число.
Например:
//PVS_VERSION::7.26
PVS-Studio_Cmd.exe
вычисляет путь до ядра используя информацию из системного реестра, которую пишет инсталлятор при установке PVS-Studio.
Для C++ проектов минимальная поддерживаемая версия значения настройки PVS_VERSION
— это 7.26 (минимальное значение для C++ проектов было добавлено в версии 7.36). Это означает, что при использовании этой настройки при анализе C++ проектов можно запустить версию ядра PVS-Studio 7.26 или выше.
Для C# проектов минимальная поддерживаемая версия значения настройки PVS_VERSION
— это 7.15. Это означает, что при использовании этой настройки при анализе C# проектов можно запустить только версию ядра PVS-Studio 7.15 или выше.
В случае установки новой версии PVS-Studio в уже существующую директорию, содержащую другую версию PVS-Studio, номер версии в реестре для этой директории будет обновлён.
Последняя установка PVS-Studio, считается установкой по умолчанию. А значит, если последней была установлена версия PVS-Studio 7.23, то такой же версии будут все плагины и PVS-Studio_Cmd.exe
. Следовательно, вы не сможете воспользоваться механизмом выбора версий ядра PVS-Studio. Поэтому, если вы хотите использовать старые версии PVS-Studio (7.23 и ниже), то вам нужно в начале установить их и только потом поставить последнюю версию PVS-Studio 7.24 или выше.
Для всех версий ниже 7.24 необходимо в реестре прописать соотношение версии и пути до каталога установки этой версии, чтобы PVS-Studio_Cmd.exe
смог найти путь до ядра PVS-Studio. Информация записывается в раздел Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ProgramVerificationSystems\PVS-Studio\Versions
.
Приоритезация файлов конфигурации
Начина с версии 7.25 утилита PVS-Studio_Cmd.exe
и плагин для Visual Studio поддерживают возможность явно задать приоритет файлов конфигурации одного уровня. Для этого необходимо использовать флаг //CONFIG_PRIORITY::number
, где number
— номер приоритета.
Начиная с версии 7.36, этот флаг поддерживается в утилите pvs-studio-analyzer
.
Например:
//CONFIG_PRIORITY::1
Чем меньше номер, тем приоритетней файл конфигурации. Файлы, в которых нет данного флага, имеют минимальный приоритет. Файлы имеющий одинаковый приоритет применяются в алфавитном порядке. Например, среди файлов Filter1.pvsconfig
, Filter2.pvsconfig
, Filter3.pvsconfig
настройки из Filter3.pvsconfig
будут приоритетными.
Флаг //CONFIG_PRIORITY
влияет только на файлы конфигурации одного уровня. В порядке возрастания приоритета файлы настроек применяются так:
- Глобальный файл конфигурации;
- Файлы конфигурации уровня решения;
- Файлы конфигурации уровня проекта;
- Файл, переданный через аргумент
‑‑rulesConfig (-c)
утилитеPVS-Studio_Cmd
.
Выполнение команд из CustomBuild task перед анализом
Чтобы PVS-Studio перед анализом выполнил команды из CustomBuild task, в файл .pvsconfig
нужно добавить следующую директиву:
//EXECUTE_CUSTOM_BUILD_COMMANDS
Эта директива применима только для .pvsconfig
файлов, передаваемых через командную строку, а также расположенных на глобальном уровне или уровне решения.
Рассмотрим случай, в котором директива может пригодиться.
Некоторые Visual C++ проекты при сборке могут генерировать исходный код с помощью команд, записанных в CustomBuild task. Запуск анализа без генерации этих файлов может привести к ошибкам. Если нужно только сгенерировать файлы, то выполнять полную сборку смысла нет (это может быть долго).
В таком случае будет полезно указать PVS-Studio соответствующую директиву, чтобы анализатор сначала выполнил команды генерации файлов, а затем провёл анализ.
Подавление ошибок парсинга
Иногда анализатор может выдавать сообщение об ошибке парсинга на полностью компилирующийся проект. Эти ошибки могут быть не критичны для качества анализа. В таком случае их можно подавить.
Ошибка парсинга имеет код:
Подавление V051 (C# анализатор)
C# анализатор выдаёт V051 при наличии хотя бы одной ошибки компиляции. Увидеть все ошибки можно запустив command line версию анализатора с флагом ‑‑logCompilerErrors
. Синтаксис для подавления этих ошибок выглядит следующим образом:
//V_EXCLUDE_PARSING_ERROR:V051:{"ProjectName": "MyProject", "ErrorCode": "CS0012", "Message": "Some message"}
В данном случае для проекта (.csproj
) MyProject будет подавлена ошибка компиляции с кодом CS0012 и сообщением "Some message".
Также не обязательно комбинировать информацию для подавления:
- //V_EXCLUDE_PARSING_ERROR:V051:{"ProjectName": "MyProject"} — подавить все ошибки на проекте MyProject
- //V_EXCLUDE_PARSING_ERROR:V051:{"ErrorCode": "CS0012"} — подавить все ошибки с кодом CS0012 для всех проектов
- //V_EXCLUDE_PARSING_ERROR:V051:{"Message": "Some message"} — подавить все ошибки с сообщением "Some message".
При указании сообщения вы можете воспользоваться масками. Например:
//V_EXCLUDE_PARSING_ERROR:V051:{Message: "Some*"}
Примечание: на данный момент подавление ошибок парсинга доступно только для V051 (C# анализатор).
Игнорирование настроек анализа из Settings.xml
В глобальном файле конфигурации Settings.xml есть ряд опций, которые влияют на результат анализа. Например, настройки выключения диагностических групп.
Вы можете использовать флаг //V_IGNORE_GLOBAL_SETTINGS ON
для того, чтобы настройки из Settings.xml
не учитывались при анализе. В этом случае включаются все диагностические группы и не применяются фильтры путей.
Для гибкой настройки анализа используйте файлы конфигурации (.pvsconfig
).
Эта опция доступна только в файле конфигурации уровня решения и влияет на работу только PVS-Studio_Cmd.exe
и плагинов для Visual Studio.
Использование каталога решения в качестве значения SourceTreeRoot
Вы можете использовать флаг //V_SOLUTION_DIR_AS_SOURCE_TREE_ROOT
для того, чтобы включить использование каталога решения в качестве значения SourceTreeRoot
.
С настройкой SourceTreeRoot
можно ознакомиться в отдельной документации.
Параметр является более приоритетным, чем UseSolutionDirAsSourceTreeRoot
из файла настроек Settings.xml.
Эта опция доступна только в файле конфигурации уровня решения и влияет на работу только PVS-Studio_Cmd.exe
и плагинов для Visual Studio.
Использование каталога решения для построения относительных путей в кэше зависимостей компиляции
Начиная с PVS-Studio версии 7.34 вы можете использовать флаг //V_SOLUTION_DIR_AS_DEPENDENCY_CACHE_SOURCE_TREE_ROOT
для того, чтобы включить использование каталога решения в качестве корневой части пути, который будет использован для построения относительных путей файлов в кэше зависимостей компиляции.
Этот флаг следует использовать в режиме проверки списка файлов и в режиме проверки модифицированных файлов. Данная настройка позволяет получить файлы кэшей зависимостей компиляции, которые затем можно использовать на машинах с отличающимся расположением проверяемых исходных файлов.
Эта настройка похожа на //V_SOLUTION_DIR_AS_SOURCE_TREE_ROOT
, только относительные пути для файлов будут строиться в файлах кэшей зависимостей компиляции, а не в отчёте анализатора.
Эта опция доступна только в файле конфигурации уровня решения и влияет на работу только PVS-Studio_Cmd.exe
.
Управление сортировкой suppress файлов
С версии PVS-Studio 7.27 внутреннее содержимое файлов подавления сортируется. Это требуется для корректного использования в системе контроля версий и избегании проблем слияния файлов.
Сообщения сортируются в следующем порядке: имя исходного файла, код диагностики, хэш строки, описание диагностики.
Если вам требуется сохранить старое поведение и отключить сортировку, вы можете указать параметр //V_DISABLE_SUPPRESS_FILE_SORTING
.
Секции настроек в .pvsconfig
Существует возможность указания специфичных правил для определённой версии PVS-Studio.
Синтаксис:
//V_SECTION_BEGIN
//V_WHEN_VERSION: <CONDITION_SEQUENCE>
....
//V_SECTION_END
Каждая секция содержит три обязательных элемента:
- //V_SECTION_BEGIN — метка начала секции;
- //V_WHEN_VERSION: — условие для определения применимости секции;
- //V_SECTION_END — метка конца секции.
Синтаксис условий:
<CONDITION_SEQUENCE> ::= <CONDITION> | <CONDITION_SEQUENCE> "|" <CONDTION>
<CONDITION> ::= <SINGLE_VERSION_COMPARISON> | <RANGE_VERSIONS_COMPARISON>
<SINGLE_VERSION_COMPARISON> ::= <OP> <VERSION>
<RANGE_VERSIONS_COMPARISON> ::= "IN" <VERSION> "," <VERSION>
<OP> ::= "EQ" | "NE" | "LT" | "LE" | "GT" | "GE"
<VERSION> ::= <NUMBER> [ "." <NUMBER> ]
Условия в V_WHEN_VERSION
могут быть скомбинированы с помощью символа |
(аналог оператора ИЛИ). Каждое подвыражение вычисляется по отдельности. Если хотя бы одно из них истинно, то секция со всеми директивами внутри неё применяется. В противном случае — отбрасывается.
Если необходимо указать не точную версию, а диапазон, то можно воспользоваться оператором IN
. Значения указываются через запятую включительно. Например, так можно указать все версии с 7.20 до 7.25 (включительно):
....
//V_WHEN_VERSION: in 7.20,7.25
....
Поддерживаемые операторы в условиях, их псевдонимы и описание:
# |
Оператор |
Alias |
Описание |
---|---|---|---|
1 |
EQ |
== |
Равно |
2 |
NE |
!= |
Не равно |
3 |
LT |
< |
Меньше |
4 |
LE |
<= |
Меньше или равно |
5 |
GT |
> |
Больше |
6 |
GE |
>= |
Больше или равно |
7 |
IN |
отсутствует |
Диапазон значений |
Регистр текстовых операторов не имеет значения. Такая запись условия также будет корректной:
....
//V_WHEN_VERSION: == 7.17 | In 7.20,7.25 | GT 8
....
Ограничения:
- каждая открытая секция должна быть корректно закрыта (конец файла не является корректным завершением секции);
- вложенные секции не допускаются;
- при сравнении версий допускается использовать только мажорную и минорную версии анализатора, разделённые точкой;
- условия могут быть использованы только после открытия секции;
- управляющие директивы допустимо использовать только после условия.
Примечания:
- директивы вне секций применяются для всех версий;
- при указании только Major версии, Minor будет неявно считаться как 0;
- при использовании старой версии анализатора (до 7.31) все директивы будут применяться вне зависимости от наличия секций;
- в случае некорректной работы с секциями будет выдана соответствующая ошибка.
Пример секции:
//V_SECTION_BEGIN
//V_WHEN_VERSION: eq 7.30 | in 7.32,7.35 | gt 8
//+V::860
//V_ASSERT_CONTRACT
//-V::1100
//V_SECTION_END
Обнаружение начальной позиции сдвига строк (для V002)
Начиная с версии 7.35 PVS-Studio поддерживает возможность вывода позиции, с которой начался сдвиг. Механизм будет полезен, если позиции предупреждений анализатора указывают на неправильные строки.
Чтобы вывести начальные позиции сдвига, добавьте флаг //+V002,VERBOSE
. Анализатор будет выдавать расширенное сообщение V002 на каждый первый потенциальный сдвиг в файле. Сообщение будет содержать строку, которую анализатор ожидал увидеть на указанной позиции.
Пример:
#include <iostream>
//+V002,VERBOSE
#pragma \
\
warning(push)
// The message V002 will be output here
void bar(int i) // This is the first line for which we detected a shift
{
auto x = i % 5;
// This would be the wrong position for V609
if ( i/x) // This is the correct position of V609
std::cout << "bar" << std::endl;
}
void x()
{
bar(5);
}
Важно: анализатор не всегда может корректно вычислить позицию начала сдвига. Это связано с особенностями сравнения исходного и препроцессированного файла, где требуется учитывать раскрытие макросов и дополнительную информацию, которую подставляет препроцессор в .i
файл.
Управление кэшем зависимостей компиляции
Начиная с PVS-Studio версии 7.35 появилась возможность управлять директорией сохранения и построения относительных путей для файлов кэша зависимостей компиляции.
Для указания директории сохранения файлов кэша используйте флаг //V_DEPENDENCY_CACHE_ROOT
. Данная настройка позволяет централизовать хранение кэшей зависимостей компиляции разных проектов.
Используйте флаг //V_DEPENDENCY_CACHE_SOURCE_ROOT
для указания директории используемой в качестве корневой части пути, который будет использован для построения относительных путей файлов в кэше зависимостей компиляции. Данная настройка позволяет получить файлы кэшей зависимостей компиляции, которые затем можно использовать на машинах с отличающимся расположением проверяемых исходных файлов.
Эти флаги следует использовать в режиме проверки списка файлов и в режиме проверки модифицированных файлов.
Пример использования:
//V_DEPENDENCY_CACHE_ROOT C:\Project\cache
//V_DEPENDENCY_CACHE_SOURCE_ROOT C:\Project
Режим отслеживания исходных файлов в кэше зависимостей
В PVS-Studio 7.35 появилась возможность указывать режим отслеживания исходных файлов в кэше зависимостей компиляции. Для этого используется флаг //V_DEPENDENCY_CACHE_TRACKING_MODE
. Он может принимать одно из следующих значений:
- ModifiedFilesOnly — в хэше отслеживаются только модификации исходных файлов.
- ModifiedAndWarningsContainingFiles — дополнительно отслеживаются файлы с предупреждениями, найденными в предыдущих прогонах анализа. Исходный файл будет анализироваться до тех пор, пока в нем содержатся предупреждения анализатора.
- Disabled — отключает отслеживание файлов и обновление кэша зависимостей.
Если значение этого флага не Disabled, то в плагине для Visual Studio появляется возможность запускать анализ модифицированных файлов через пункт меню Extension > PVS-Studio > Check > Modified Files и пункт Analyze Modified Files with PVS-Studio в контекстном меню решений и проектов.
При использовании этого флага кэш зависимостей компиляции будет обновляться независимо от режима анализа — как при анализе модифицированных файлов, так и в обычном режиме.
Разметка предупреждений, связанных с потенциальными проблемами безопасности
Начиная с PVS-Studio версии 7.37, появилась возможность выделить дополнительной маркировкой предупреждения, относящиеся к потенциальным проблемам безопасности и классифицируемые согласно ГОСТ Р 71207-2024, в поле SAST
в результатах анализа. Чтобы сделать это, нужно добавить флаг //V_SEC_ID
с режимом SHOW
:
//V_SEC_ID: SHOW
Для деактивации настройки воспользуйтесь этим же флагом с режимом HIDE
:
//V_SEC_ID: HIDE
Пример:
void func()
{
const wchar_t wstr[] = L"12345";
printf("%s\n", wstr);
}
На данный код анализатор выдаст предупреждение: V576 Consider checking the second actual argument of the 'printf' function. The pointer to string of char type symbols is expected.
При включении настройки анализатор добавит идентификатор SEC-STR-FORMAT
в поле SAST
этого предупреждения.