静态分析方法论涉及各种技术。 其中之一是在分析文件之前对文件进行预处理。 准备的文件由在特殊工作模式下运行的编译器创建。 不幸的是,我们在开发静态分析仪方面的长期经验表明,此模式不适用于测试。 在本说明中,我将举例说明Microsoft C ++编译器中的一个新错误。
引言
为了演示PVS-Studio静态分析器的功能,我们的团队检查了开源项目的代码。 这
对开源软件的质量,额外的宣传和分析仪的测试
做出了重大
贡献 。 有时,我们会发现编译器中一些非常不寻常的问题,而分析器则很难解决这些问题。 因此,我的同事最近写了一篇文章“
带有'import'指令的文件不再起作用(编译器内部错误'msc1.cpp')。我们该怎么办? ”帮助我们的用户解决“别人的”问题。
与CSS有什么关系?
我刚刚在检查大型项目时发现了一个同样有趣的错误。 在分析几个文件时,用于19.16.27027.1(Visual Studio v15.9.9)版本的C / C ++的Microsoft编译器刚刚发出了这样的错误:
fatal error C1021: invalid preprocessor command 'tooltiphint'
显然,它不是预处理程序指令,但是它是什么? 这是CSS代码的一部分:
#tooltiphint { position: fixed; width: 50em; margin-left: -25em; left: 50%; padding: 10px; border: 1px solid #b0b0b0; border-radius: 2px; box-shadow: 1px 1px 7px black; background-color: #c0c0c0; z-index: 2; }
在仔细研究了该片段之后,可以清楚地看到,在预处理文件时,编译器会出错,而代码已成功编译。 CSS代码的片段是C ++代码字符串文字的一部分。 这是足以重现该错误的代码示例:
std::string test = R"<<<( <style type="text/css"> body { color:#000000; background-color:#ffffff } body { font-family:Helvetica, sans-serif; font-size:10pt } #tooltiphint { position: fixed; width: 50em; margin-left: -25em; left: 50%; padding: 10px; border: 1px solid #b0b0b0; border-radius: 2px; box-shadow: 1px 1px 7px black; background-color: #c0c0c0; z-index: 2; } .macro { color: darkmagenta; background-color:LemonChiffon; /* Macros are position: relative to provide base for expansions. */ position: relative; } </style> </head> <body>)<<<";
上面的代码片段不会阻止成功的编译,但是同时,在预处理模式下会发生错误(
/ P标志)。
如您所见,静态分析器开发人员的工作绝非易事:)。 PVS-Studio似乎不应该受到指责,但我们仍然必须处理此类问题。 好吧,没有新消息。 您可以在文章“
PVS-Studio和敌对环境 ”中查看其他类似情况。
结论
该问题将发送到官方的bug跟踪程序,但是很难快速解决该问题。 例如,我们几个月前检测到的开头提到的
#import指令问题仅在下一个Visual Studio版本中得以解决。 由于新的Visual Studio 2019的发布将在一周内,因此很可能他们将无法在该日期之前修复此错误。 使用PVS-Studio的用户,建议您也使用宏
PVS_STUDIO 。