﻿# Предопределённый макрос PVS\_STUDIO

Наряду со многими другими способами фильтрации и подавления диагностических сообщений, в PVS\-Studio есть предопределённый макрос _PVS\_STUDIO_\.

Первый случай, когда он может пригодиться — чтобы какой\-то код не попадал в анализатор на проверку\. Например, анализатор выдаёт диагностическое сообщение на такой код:

```cpp
  int rawArray[5];
  rawArray[-1] = 0;
```

Однако, если его "обернуть" с помощью этого макроса, то сообщения не будет:

```cpp
  int rawArray[5];
#ifndef PVS_STUDIO
  rawArray[-1] = 0;
#endif
```

Второй случай — переопределение стандартных и пользовательских макросов\. Например, на следующем коде будет выдано предупреждение о разыменовании потенциально нулевого указателя:

```cpp
char *st = (char*)malloc(10);
TEST_MACRO(st != NULL);
st[0] = '\0'; //V522
```

Чтобы подсказать анализатору, что выполнение программы прерывается при неверном условии, можно переопределить макрос следующим образом:

```cpp
#ifdef PVS_STUDIO
#undef TEST_MACRO
#define TEST_MACRO(expr) if (!(expr)) throw "PVS-Studio";
#endif

char *st = (char*)malloc(10);
TEST_MACRO(st != NULL);
st[0] = '\0';
```

Этот способ позволяет устранить предупреждения анализатора на коде, тестируемом с помощью разных библиотек, а также на любых других макросах, использующихся для отладки и тестирования\.

См\. также обсуждение "[Mark variable as not NULL after BOOST\_REQUIRE in PVS\-Studio](https://stackoverflow.com/questions/47283349/mark-variable-as-not-null-after-boost-require-in-pvs-studio)" на сайте StackOverflow\.com\.

Начиная с версии 7\.30, в PVS\-Studio были добавлены макросы _PVS\_STUDIO\_MAJOR_ и _PVS\_STUDIO\_MINOR_, которые отражают мажорную и минорную версии ядра анализатора\. 

При помощи этих макросов можно настраивать поведение анализа для блока кода в зависимости от версии анализатора\. Например, можно [включать или отключать](https://pvs-studio.ru/ru/docs/manual/0017/#IDBDB7967E63) диагностические правила только для определённых версий PVS\-Studio:

```cpp
// Auxiliary macros
#if defined(PVS_STUDIO) \
 && defined(PVS_VERSION_MAJOR) \
 && defined(PVS_VERSION_MINOR) \

#define PVS_VERSION_MACROS_INTRODUCED 1
#define PVS_MAKE_VERSION(major, minor) ( ((major) << 16) | (minor) )
#define PVS_CURRENT_VERSION \
          PVS_MAKE_VERSION(PVS_VERSION_MAJOR, PVS_VERSION_MINOR)

#else
#define PVS_VERSION_MACROS_INTRODUCED 0
#endif

// ....

// Need to disable V691 on code block

#if PVS_VERSION_MACROS_INTRODUCED
#if PVS_CURRENT_VERSION < PVS_MAKE_VERSION(7, 35)
#pragma pvs(push)
#pragma pvs(disable: 591)
#endif
#endif

// code block

#if PVS_VERSION_MACROS_INTRODUCED
#if PVS_CURRENT_VERSION < PVS_MAKE_VERSION(7, 35)
#pragma pvs(pop)
#endif
#endif
```

Макросы _PVS\_STUDIO_, _PVS\_STUDIO\_MAJOR_ и _PVS\_STUDIO\_MINOR_ будут автоматически подставлены при проверке кода из IDE и утилит _PVS\-Studio\_Cmd\.exe_, _pvs\-studio\-analyzer_ / _CompilerCommandsAnalyzer_\. Если же для проверки проекта вы используете [прямой вызов ядра анализатора](https://pvs-studio.ru/ru/docs/manual/0006/), то по умолчанию макросы не передаются анализатору, и это нужно сделать вручную\.