>
>
PVS-Studio выдает ошибку "Some dia…

Евгений Рыжков
Статей: 125

PVS-Studio выдает ошибку "Some diagnostic messages may contain incorrect line number for file ..." (продолжение)

Мы уже писали про причины появления сообщения "Some diagnostic messages may contain incorrect line number for file ...". Напомню, что из-за ошибки препроцессора в Visual C++ 2005 (без SP1) многострочные #define обрабатывались некорректно. Что приводит к ошибке позиционирования анализатора PVS-Studio. Если у вас выдается это сообщение, то рекомендую прочитать указанную запись, чтобы понять, в чем дело и как с этим справиться.

К сожалению, обнаружилась еще одна ситуация, при которой выдается сообщение "Some diagnostic messages may contain incorrect line number for file ..." и происходит сбой в позиционировании диагностических сообщений. Речь идет о многострочных директивах #pragma специального вида. Вот пример корректного кода:

#pragma warning(push) 
void test()
{
  int a = 0;
  size_t b = a; // PVS-Studio сообщит об ошибке здесь
}

Если же директиву #pragma записать в две строки, то анализатор PVS-Studio укажет на ошибку в неправильном месте (будет сбой на одну строку):

#pragma \
  warning(push) 
void test()
{
  int a = 0;     // PVS-Studio укажет на ошибку здесь,
  size_t b = a;  // хотя реально ошибка должна быть здесь.
}

Хотя в другом случае с многострочной директивой #pragma ошибки не будет:

#pragma warning \
  (push) 
void test()
{
  int a = 0;
  size_t b = a; // PVS-Studio сообщит об ошибке в этой строке
}

Как и в предыдущей записи про сообщение "Some diagnostic messages may contain incorrect line number for file ...", эта ошибка связана с использованием препроцессора от Visual C++.

Однако эта ошибка не лечится установкой Service Pack 1 на Visual Studio 2005 или переходом на Visual Studio 2008. Единственная рекомендация - это либо не использовать многострочные директивы #pragma, либо использовать, но в том варианте, в котором они корректно обрабатываются.