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