Visual C ++编译器中的#line指令错误

image1.png

#line指令由预处理器添加,然后可用于了解预处理文件中特定代码所属的文件和行。#line指令告诉代码工具将内部存储的行号和编译器文件的名称更改为指定的行号。以下几行将相对于给定位置开始计数。显式预处理主要用于调试或由各种生成器使用。在任何情况下,此类功能中的错误都可能导致各种负面后果。这些问题之一是Visual Studio 2019中PVS-Studio的用户发生的。

错误历史和描述


#line指令是预处理文件的重要组成部分,PVS-Studio分析仪使用该预处理文件在必要的用户代码行上发出警告。这是错误搜索故事的起点。

我们的一个拥有大量代码库的用户开始在Visual Studio 2019中将整个项目从Platform Toolset版本v141转换为v142。此后,在分析结果中,大量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版(2020年1月14日))有关。我们打开了错误报告“ 预处理后无效的#line指令(VS2019,v142) ”,并在4天后收到一个有趣的答案:

此问题已被识别为与先前报告的反馈的重复,链接在这里:developercommunity.visualstudio.com/content/problem /738407/preprocessor-generates-incorrect-line-information.html。如果您在此处报告或投票,则您的投票已应用于原始问题。其他所有人都可以在上面的链接反馈中直接添加他们的投票。通过在一个反馈中整合客户影响,投票有助于提高问题的优先级。谢谢!

事实证明,已经报告了此问题大约在半年前的20199月18日:“ 预处理器生成了错误的行信息 ”。用户提供了类似的代码示例来重现该错误。根据作者的说法,该错误至少在Visual Studio 2019 16.2中存在。

不知道这是否是巧合,但是在活动几天后,该错误被分配为固定待处理下达状态

2020年5月19日,发布了Visual Studio 2019 16.6.0的修订版。我们建议所有PVS-Studio用户使用它。


如果您想与讲英语的读者分享这篇文章,请使用以下链接:Svyatoslav Razmyslov。由Visual C ++编译器中的#line指令引起的错误

All Articles