用于验证Visual Studio一致性切换对生成的代码的影响的工具

问题描述 投票:1回答:1

最近的Visual Studio(15.7)的次要版本实现了编译器开关/许可 - 除了其他效果之外,它还支持模板的两阶段名称查找(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工具检查生成的符号,看看是否生成了相同的符号。这只能暴露一部分问题:文件中的模板实例集可能相同,但它们在代码中的位置可能会发生变化。

c++ visual-studio visual-c++ visual-studio-2017
1个回答
2
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.