Мы уже писали про причины появления сообщения "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, либо использовать, но в том варианте, в котором они корректно обрабатываются.