静态分析方法使用不同的技术。 其中之一是在分析文件之前立即对其进行预处理。 预处理文件由以特殊操作模式运行的编译器创建。 不幸的是,正如我们在开发静态代码分析器方面的多年经验所表明的那样,该模式并未经过很好的测试。 在本说明中,我将举一个Microsoft的C ++编译器中新发现的错误的示例。
引言
为了演示PVS-Studio静态分析器的功能,我们的团队检查了开源项目的源代码。 这
对开源软件,其他广告和分析仪测试的质量
做出了重大
贡献 。 有时我们会在编译器中发现非常罕见的问题,这些问题在分析器方面很难完成。 因此,一位同事最近写了一篇文章“
已停止分析带有'import'指令的
文件(编译器内部错误'msc1.cpp')。该怎么办? ”帮助我们的用户解决“外部”问题。
CSS呢?
我在检出大型项目时发现了一个同样有趣的错误。 分析多个文件时,C / C ++版本19.16.27027.1(Visual Studio v15.9.9)的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>)<<<";
上面的代码片段不会干扰成功的编译,但是同时,在预处理模式(flag
/ P )中会发生错误。
对于静态分析仪的开发人员来说,这是一段艰难的日子:)。 PVS-Studio似乎不应该受到指责,但我们仍然应该处理类似的问题。 但是,这并不是什么新鲜事物。 在文章“
PVS-Studio和敌对环境 ”中可以找到其他一些类似的情况。
结论
该问题将发送到官方的错误跟踪器,但是很难快速解决该问题。 例如,我们几个月前确定的
#import指令的问题(我在开始时曾写过)仅在下一版Visual Studio中得以解决。 因为 新的Visual Studio 2019的发布将在一周内完成,很可能在此日期之前不会修复此错误。 还建议PVS-Studio用户使用
PVS_STUDIO宏。

如果您想与说英语的读者分享这篇文章,请使用以下链接:Svyatoslav Razmyslov。
CSS标记片段如何破坏C ++编译器