# V011. Presence of #line directives may cause some diagnostic messages to have incorrect file name and line number.

Директива #line генерируется препроцессором и предназначена для того, чтобы понять, какому файлу и строке соответствует та или иная строка в препроцессированном файле.

Поясним это с помощью примера.

    #line 20 "a.h"
    void X(); // Объявление функции X находится в 20 строке в файле a.h
    void Y(); // Объявление функции Y находится в 21 строке в файле a.h
    void Z(); // Объявление функции Z находится в 22 строке в файле a.h
    #line 5 "a.cpp"
    int foo; // Переменная foo объявлена в 5 строке в файле a.cpp
    int X() { // Реализация функции X начинается в 6 строке в файле a.cpp
      return 0; // 7 строка
    } // 8 строка

Директивы #line используют различные инструменты, в том числе и анализатор PVS-Studio, чтобы осуществлять навигацию по файлу.

Иногда бывает так, что по какой-то причине директивы #line содержатся в файлах с исходным кодом (*.c; *.cpp; *.h и т.д.). Например, такое может произойти, если файл был сгенерирован каким-либо способом автоматически (пример).

При препроцессировании эти директивы #line будут добавлены в препроцессированный *.i файл. Например, пусть есть файл A.cpp следующего вида:

    int a;
    #line 30 "My.y"
    int b = 10 / 0;

После препроцессирования получится файл A.i следующего содержания:

    #line 1 "A.cpp"
    int a;
    #line 30 "My.y"
    int b = 10 / 0;

В результате, навигация будет сломана. Анализатор обнаружит деление на ноль и выдаст сообщение, что эта ошибка находится в 30 строке в файле My.y. Формально анализатор прав, ведь ошибка действительно появилась из-за некорректного текста программы в файле My.y. Однако навигация сломана, и вы не сможете просмотреть файл My.y, так как этого файла может просто не быть в проекте. При этом вы не узнаете, что сейчас деление на 0 на самом деле возникает в 3 строке файла A.cpp.

Чтобы исправить ситуацию, мы предлагаем удалить все директивы #line, которые присутствуют в исходных файлах вашего проекта. Как правило, эти директивы оказались в файле случайно и никому не помогают, а только вносят путаницу, мешая работе различных инструментов, таких как анализаторы кода.

Чтобы обнаружить вредные #line в исходном коде и предназначена диагностика V011. Анализатор указывает на 10 первых #line в файле. Большее количество указывать не рационально. Вы можете самостоятельно легко найти с помощью поиска в используемом вами редакторе кода все директивы #line и удалить их.

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

    int a;
    int b = 10 / 0;

После препроцессирования будет получен *.i файл следующего содержания:

    #line 1 "A.cpp"
    int a;
    int b = 10 / 0;

Теперь навигация будет работать правильно и анализатор предупредит, что деление на 0 возникнет во второй строке файла A.cpp.