﻿# V1003\. Macro expression is dangerous or suspicious\.

Анализатор обнаружил потенциально возможную ошибку в записи макроса\.

Пример:

```cpp
#define sqr(x) x * x
```

Этот макрос стоит переписать таким образом:

```cpp
#define sqr(x) ((x) * (x))
```

В изначальной реализации макроса есть две проблемы, которые могут привезти к ошибке\. Во\-первых, сам макрос стоит обернуть в скобки\. Если этого не сделать, то это приведёт к ошибке при написании такого коде:

```cpp
double d = 1.0 / sqr(M_PI);  // 1.0 / M_PI * M_PI == 1.0
```

По той же причине стоит поставить в скобки аргументы:

```cpp
sqr(M_PI + 0.42);  // M_PI + 0.42 * M_PI + 0.42
```

Из\-за того, что препроцессор работает на уровне лексем, не всегда получается получить корректное синтаксическое дерево из текста макроса\. Рассмотрим пример:

```cpp
#define FOO(A,B) A * B
```

В зависимости от контекста, это может быть, как умножением A на B, так и объявлением переменной B, которая будет являться указателем на A\. Так как в момент объявления макроса нет никакой информации о его использовании, анализатор может выдать ложное срабатывание на корректны код\. В таком случае, для подавления ложного срабатывания, вы можете воспользоваться [одним из способов](https://pvs-studio.ru/ru/docs/manual/0017/), описанных в документации\.

Примечание\. Родственной по смыслу диагностикой является [V733](https://pvs-studio.ru/ru/docs/warnings/v733/)\. Диагностика V733 работает более точно и даёт меньше ложных срабатываний, так как анализирует уже раскрытый макрос, а не его объявлении\. С другой стороны, возможности V733 более ограничены и диагностика не предупредит о многих ошибках\.

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

```cpp
#if A
doA();
#else doB();
#endif
```

Во время редактирования код был случайно удалён перенос строки и функция 'doB\(\)' перестала вызываться\. При этом код остался компилируемым\.

Исправленный вариант кода:

```cpp
#if A
doA();
#else
doB();
#endif
```