验证Visual Studio一致性开关对生成的代码的影响的工具

时间:2018-08-27 16:33:01

标签: c++ visual-studio visual-c++ visual-studio-2017

Visual Studio(15.7)的最新次要发行版实现了编译器开关/ permissive-,除其他效果外,它还可以对模板(https://docs.microsoft.com/en-us/cpp/build/reference/permissive-standards-conformance)进行两阶段名称查找。我想在大约4M行代码的代码库上启用此开关。问题是,如果启用了此开关,则实例化的模板可能会更改(请参见https://blogs.msdn.microsoft.com/vcblog/2017/09/11/two-phase-name-lookup-support-comes-to-msvc/的第一个示例),从而导致运行时行为发生静默更改。

是否可以检查启用此一致性开关后生成的代码是否与旧代码相同?

我知道正确的答案是“您运行单元测试,,!”。可悲的是,由于遗留了大量的遗留代码,因此在接下来的几年中这是无法实现的,因此我正在寻找替代方法。

对二进制文件进行比较无济于事,因为元数据更改会导致差异。 新的编译错误也没有任何帮助:它们只暴露不符合标准的语法;生成代码中的更改仍然可以隐藏。 实际上,查看生成的代码并不重要。显示“此行将以不同的方式编译”的工具就足够了。或类似于“对文件进行预处理”为预处理器执行的操作。

我能想到的最好的办法是通过每个.obj文件上的dumpbin工具检查生成的符号,以查看是否正在生成相同的符号。这只能暴露出一部分问题:文件中的模板实例集可能是相同的,但是它们在代码中的位置可能会更改。

1 个答案:

答案 0 :(得分:2)

您可以分析编译器输出(在汇编级别),以检查与您提到的2个编译器设置生成的差异。

请查看有关Visual C ++编译器的related SO question

此外,更适合代码的相对较小部分,
您可能想使用出色的GodBolt's Compiler Explorer
它执行相同的任务,但具有方便的Web界面,并扩展到各种编译器(不仅限于Microsoft Visual C ++)。
我确信它将成为开发人员工具集中最有价值的工具之一。