不同操作系统的Valgrind错误不同

Valgrind error differ in operating systems

本文关键字:错误 Valgrind 操作系统      更新时间:2023-10-16

我使用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库中报告了错误,我不认为在boost库中可能存在错误(boost版本在两台机器上是相同的1.46.1)。

出现不同错误报告的原因是什么?

Valgrind不是一个静态分析工具,而是一个运行时工具,即Valgrind在虚拟机上运行程序。在许多应用程序中,有许多代码不是由每台机器触发的,也不是为每台机器编译的,这解释了它们之间的差异。

您在两台计算机上使用不同的编译器吗?当访问未初始化的变量时,不同的编译器或不同的编译器版本可能会产生不同行为的代码。

我有过这样的语句

if (A && B) {
  do_stuff
}

A为true时才初始化B。 当我没有使用优化时,程序(如预期的那样)首先检查A,然后,如果它是真的,检查B。优化时,编译器发现首先检查B是有益的;由于AB都没有任何副作用或依赖于易失性内存,这是等效的。后一种行为导致valgrind给了我你所看到的警告类型,即使代码没有任何真正的错误。