Для получения триального ключа
заполните форму ниже
Team license
Enterprise license
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Запросите информацию о ценах
Новая лицензия
Продление лицензии
--Выберите валюту--
USD
EUR
RUB
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Бесплатная лицензия PVS-Studio для специалистов Microsoft MVP
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Для получения лицензии для вашего открытого
проекта заполните, пожалуйста, эту форму
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Мне интересно попробовать плагин на:
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Ваше сообщение отправлено.

Мы ответим вам на


Если вы так и не получили ответ, пожалуйста, проверьте папку
Spam/Junk и нажмите на письме кнопку "Не спам".
Так Вы не пропустите ответы от нашей команды.

>
>
Ошибка с директивой #line в компиляторе…

Ошибка с директивой #line в компиляторе Visual C++

20 Май 2020

Директива #line добавляется препроцессором и затем может быть использована для понимания, к какому файлу и строке относится тот или иной фрагмент кода в препроцессированном файле. Директива #line указывает инструментам, работающим с кодом, изменить внутренний хранимый номер строки и имя файла компилятора на заданный номер строки. Следующие строки уже будут отсчитывать относительно заданной позиции. Явное препроцессирование, в основном, используется для отладки или различными генераторами. В любом случае, ошибка в таком функционале может приводить к разным негативным последствиям. Одна из таких проблем возникла у пользователя PVS-Studio в Visual Studio 2019.

0736_VisualCppLineBug_ru/image1.png

История и описание ошибки

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

Один из наших пользователей с большой кодовой базой начал перевод всего проекта с Platform Toolset версии v141 на v142 в Visual Studio 2019. После чего, в результатах анализа возник всплеск предупреждений V002 и выдача нескольких десятков других предупреждений не на те строки кода (ошибка на одну строку).

Диагностика V002 как раз детектирует такие ситуации (некорректная нумерация строк). Обычно это возникает из-за многострочных макросов или других директив препроцессора (например, #pragma). Проблема возникает не очень часто, но преимущественно на компиляторе от Microsoft. Такой всплеск проблем на одном проекте был неожиданным, т.к. наша система тестирования не показывала наличия такой серьёзной проблемы, и мы начали отлаживать анализатор на препроцессированном файле пользователя.

Через несколько часов отладки мы установили, что анализатор уже работает с некорректными данными о строках кода и смогли составить тестовый пример:

#define MACRO(a, b)              // line1
                                 // line2
int main(int argc, char* argv[]) // line3
{                                // line4
    MACRO("Some string",         // line5
        42);                     // line6
    return 0;                    // line7 <=
}

Препроцессированный файл получается такой:

#line 1 "D:\\_Tests\\TestApp\\Project2\\rnd_bs.cpp"


int main(int argc, char* argv[])
{
  ;
#line 8 "D:\\_Tests\\TestApp\\Project2\\rnd_bs.cpp"
  return 0;
}

Оператор return находится на 7-й строке в исходном файле, а препроцессор указывает на 8-ю строку. Эта ошибка в препроцессоре возникла, предположительно, из-за многострочного макроса.

Релиз исправленной версии

На момент написания статьи, проблема была актуальна для последних версий Visual Studio, вплоть до версии 16.4.3 (от 14 января 2020 года). Мы открыли Bug Report "Invalid #line directive after preprocessing (VS2019, v142)" и через 4 дня получили интересный ответ:

This issue has been identified as a duplicate of an earlier reported feedback linked here: https://developercommunity.visualstudio.com/content/problem/738407/preprocessor-generates-incorrect-line-information.html. If you reported or voted here, your vote has been applied to the original issue. Everyone else can add their vote directly at the above linked feedback. Voting helps increase the priority of the issue by consolidating customer impact under one feedback. Thank you!

Оказывается, об этой проблеме уже сообщили, причём 18 сентября 2019 года – почти полгода назад: "Preprocessor generates incorrect line information". Пользователь представил аналогичные примеры кода для воспроизведения ошибки. По словам автора, ошибка существует как минимум с Visual Studio 2019 16.2.

Неизвестно, совпадение это или нет, но через несколько дней нашей активности ошибке присвоили статус Fixed - Pending Release.

19 мая 2020 года вышла исправленная версия Visual Studio 2019 16.6.0. Рекомендуем всем пользователям PVS-Studio перейти на неё.

Последние статьи:

Опрос:

Популярные статьи по теме
Как Apple и другие крупные компании настиг программный баг

Дата: 09 Ноя 2022

Автор: Ульяна Гришина

Сегодня мы отобрали свежие случаи программных ошибок, чтобы вы могли немного отвлечься и, возможно, узнать что-то новенькое. Если вам интересно узнать, как программисту удалось сломать Интернет по вс…
Единороги компании PVS-Studio

Дата: 30 Авг 2022

Автор: Андрей Карпов

Скорее всего вы перешли на эту статью, заинтересовавшись одним из наших рисунков единорогов. Приятно видеть ваш интерес. Сейчас мы расскажем, почему рисуем этих единорогов, что они означают и чем воо…
Обрабатывать ли в PVS-Studio вывод других инструментов?

Дата: 26 Май 2022

Автор: Андрей Карпов

Анализатор PVS-Studio умеет "схлопывать" повторяющиеся предупреждения. Предоставляет возможность задать baseline, что позволяет легко внедрять статический анализ в legacy-проекты. Стоит ли предостави…
15000 ошибок в открытых проектах

Дата: 24 Май 2022

Автор: Андрей Карпов

Количество багов в нашей коллекции перевалило за отметку 15000. Именно такое количество ошибок обнаружила команда PVS-Studio в различных открытых проектах. Особенно интересно, что это всего лишь побо…
Комментарии в коде как вид искусства

Дата: 04 Май 2022

Автор: Сергей Хренов

Приветствую всех программистов, а также сочувствующих. Кто из нас хотя бы раз в жизни не оставлял комментарии в коде? Был ли это ваш код, а может, чужой? Что за комментарии вы написали: полезные или …

Комментарии (0)

Следующие комментарии
Unicorn with delicious cookie
Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо