我正在使用一个相当成熟的大型C++项目(10年以上的开发,150k + SLOC,3k +测试用例,www.sumo-sim.org).我们最近发现,当在特定位置放入一个看似无辜的print语句(std :: cout <<"foo \n";)时,程序行为会以意想不到的方式发生变化.objdump输出还显示生成的代码中的大的更改,具体取决于该print语句的存在.
目前我们最好的猜测是这与未定义的行为和编译器优化有关(正如John Regehr在一篇文章中所讨论的那样).我们的观察结果支持这种假设,即print语句的效果受优化级别的影响.由于应用程序在单线程中运行并发应该不是问题.
为了调试未定义的行为,我们使用了clang with flags -fsanitize = undefined,unsigned-interger-overflow,address,integer并且摆脱了所有指出的问题.我们还修复了clang静态分析仪指示的所有问题,但问题仍然存在(奇怪的是gcc,clang和msvc,但结果略有不同).
现在我们对如何最好地继续我们的调试工作缺乏想法.由于print语句效果的非本地化,我们甚至不知道从哪里开始进行代码审查.
问题1:您建议使用哪些工具对潜在问题点进行静态和运行时分析(类似于上述的clang工具)?
问题2:除了未定义行为+编译器优化的组合之外,哪些机制可能是观察到的效果的候选者(非功能性语句改变程序行为)?