C++ Valgrind错误在操作系统中有所不同

C++ Valgrind错误在操作系统中有所不同,c++,linux,macos,debugging,valgrind,C++,Linux,Macos,Debugging,Valgrind,我使用valgrind调试我的应用程序。我有两台机器,我想在其中运行代码而不出错。 一个是运行valgrind 3.7.0的Ubuntu11.10,另一个是运行valgrind 3.6.0和valgrind 3.8.0的MacOSX10.7.2 我运行以下valgrind命令: valgrind --track-origins=yes ./my_program 在Linux机器上,我没有收到任何错误报告。在Mac上valgrind抱怨 ==35723== Conditional jump o

我使用valgrind调试我的应用程序。我有两台机器,我想在其中运行代码而不出错。 一个是运行valgrind 3.7.0的Ubuntu11.10,另一个是运行valgrind 3.6.0和valgrind 3.8.0的MacOSX10.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在虚拟机上运行程序。在许多应用程序中,有大量代码不是由每台机器触发的,也不是为每台机器编译的,这解释了这些差异。

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

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

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

我已经有过这种形式的语句

if (A && B) {
  do_stuff
}

其中,
B
仅在
A
为真时初始化。当我没有使用优化时,程序(如预期的那样)首先检查
A
,然后,如果是真的,则检查
B
。优化时,编译器发现首先检查
B
是有益的;由于
A
B
都没有任何副作用或依赖于易失性存储器,因此这是等效的。后一种行为导致
valgrind
向我发出您看到的警告类型,即使代码没有任何问题。我猜这里也发生了类似的事情。

我有过类似的声明

if (A && B) {
  do_stuff
}

其中,
B
仅在
A
为真时初始化。当我没有使用优化时,程序(如预期的那样)首先检查
A
,然后,如果是真的,则检查
B
。优化时,编译器发现首先检查
B
是有益的;由于
A
B
都没有任何副作用或依赖于易失性存储器,因此这是等效的。后一种行为导致
valgrind
向我发出您看到的警告类型,即使代码没有任何问题。我的猜测是类似的情况正在发生。

当前的Boost版本是1.47,你怎么会有3.6.1?你为什么关心它们如何不同?相反,修复一个版本指示的问题,然后两个版本都会通过。3.6.1是Valgrind的当前版本,@tune2fs请修复您的问题。抱歉,我已将版本更改为1.46。1当前的Boost版本是1.47,您如何拥有3.6.1?您为什么关心它们之间的差异?相反,修复一个版本指示的问题,然后两个版本都会通过。3.6.1是Valgrind的当前版本,@tune2fs请修复您的问题。很抱歉,我已将版本更改为1.46.1。这两台机器上都有两个不同版本的gcc,我尝试使用相同的版本编译它。这两台机器上都有两个不同版本的gcc,我试着用相同的版本编译它。