Для получения триального ключа
заполните форму ниже
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 перейти на неё.

Популярные статьи по теме
Обрабатывать ли в PVS-Studio вывод других инструментов?

Дата: 26 Май 2022

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

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

Дата: 24 Май 2022

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

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

Дата: 04 Май 2022

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

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

Дата: 15 Фев 2022

Автор: Николай Миронов

Кажется, анонс Visual Studio 2022 был только недавно, и вот она уже вышла. Это означало ровно одно – поддержать данную IDE нужно в ближайшем релизе PVS-Studio. О том, с какими сложностями пришлось ст…
Лучшие срабатывания статического анализатора

Дата: 29 Окт 2021

Автор: Максим Звягинцев

У всех, кто запускал статический анализатор в первый раз на большом проекте, был небольшой шок по поводу сотен, тысяч или даже десятков тысяч предупреждений. Как-то грустно становится после такого. Т…

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

Следующие комментарии
Этот сайт использует куки и другие технологии, чтобы предоставить вам более персонализированный опыт. Продолжая просмотр страниц нашего веб-сайта, вы принимаете условия использования этих файлов. Если вы не хотите, чтобы ваши данные обрабатывались, пожалуйста, покиньте данный сайт. Подробнее →
Принять