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

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

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

```cpp
#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 и т\.д\.\)\. Например, такое может произойти, если файл был сгенерирован каким\-либо способом автоматически \([пример](https://stackoverflow.com/questions/9152854/what-does-line-mean)\)\.

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

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

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

```cpp
#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 и удалить их\.

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

```cpp
int a;
int b = 10 / 0;
```

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

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

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