我使用valgrind来调试我的应用程序。我有两台机器,我想运行代码没有错误。 一个是运行valgrind 3.7.0的ubuntu 11.10,另一个是带有valgrind 3.6.0和valgrind 3.8.0的Mac OS X 10.7.2。
我运行以下valgrind命令:
valgrind --track-origins=yes ./my_program
在Linux机器上我没有收到任何错误报告。在Mac valgrind抱怨
==35723== Conditional jump or move depends on uninitialised value(s)
==35723== at 0x10004DCAF: boost::spirit ...
由于在boost lib中报告了错误,我认为升级库中可能没有错误(升级版本在两台机器上都是相同的1.46.1)。
不同错误报告的原因是什么?
答案 0 :(得分:3)
Valgrind不是静态分析工具,而是运行时工具,即valgrind在虚拟机上运行程序。许多应用程序中有大量代码不是由每台机器触发或编译的,这解释了不同之处。
答案 1 :(得分:1)
您是否在两台计算机上使用不同的编译器?也许不同的编译器或不同的编译器版本在访问未初始化的变量时会产生具有不同行为的代码。
答案 2 :(得分:1)
我已经有了表格的陈述
if (A && B) {
do_stuff
}
其中B
仅在A
为真时才初始化。当我没有使用优化时,程序(如预期的那样)首先检查A
然后,如果是,则检查B
。优化时,编译器发现首先检查B
是有利可图的; 由于A
和B
都没有任何副作用或依赖于易失性内存,这是等效的。后一种行为导致valgrind
给我一种你所看到的警告类型,即使代码没有任何问题。我猜这里发生了类似的事情。