>
>
>
V1003. Macro expression is dangerous or…


V1003. Macro expression is dangerous or suspicious.

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

Пример:

#define sqr(x) x * x

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

#define sqr(x) ((x) * (x))

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

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

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

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

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

#define FOO(A,B) A * B

В зависимости от контекста, это может быть, как умножением A на B, так и объявлением переменной B, которая будет являться указателем на A. Так как в момент объявления макроса нет никакой информации о его использовании, анализатор может выдать ложное срабатывание на корректны код. В таком случае, для подавления ложного срабатывания, вы можете воспользоваться одним из способов, описанных в документации.

Примечание. Родственной по смыслу диагностикой является V733. Диагностика V733 работает более точно и даёт меньше ложных срабатываний, так как анализирует уже раскрытый макрос, а не его объявлении. С другой стороны, возможности V733 более ограничены и диагностика не предупредит о многих ошибках.

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

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

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

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

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

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