Valgrind错误在操作系统中有所不同
Posted
技术标签:
【中文标题】Valgrind错误在操作系统中有所不同【英文标题】:Valgrind error differ in operating systems 【发布时间】:2011-10-31 15:50:31 【问题描述】:我使用 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 库中可能没有错误(两台机器 1.46.1 上的 boost 版本相同)。
不同错误报告的原因可能是什么?
【问题讨论】:
目前的Boost版本是1.47,怎么会有3.6.1? 您为什么要关心它们有何不同?相反,解决一个版本指示的问题,然后两个都会通过。 3.6.1 是 Valgrind 的当前版本,@tune2fs 请解决您的问题。 对不起,我已将版本更改为 1.46.1 【参考方案1】:Valgrind 不是静态分析工具,而是运行时工具,即 valgrind 在虚拟机上运行程序。许多应用程序中的大量代码并不是由每台机器触发或编译的,这解释了它们之间的差异。
【讨论】:
【参考方案2】:您是否在两台计算机上使用不同的编译器?在访问未初始化的变量时,可能不同的编译器或不同的编译器版本会生成具有不同行为的代码。
【讨论】:
它们是两台机器上两个不同版本的gcc,我尝试用相同的版本编译。【参考方案3】:我有过这种形式的陈述
if (A && B)
do_stuff
其中B
仅在A
为真时才被初始化。当我没有使用优化时,程序(如预期的那样)首先检查A
,然后,如果是真的,检查B
。优化时,编译器发现先检查B
是有利可图的; 因为A
和B
都没有任何副作用或依赖于易失性内存,这是等价的。后一种行为导致valgrind
给了我你所看到的警告类型,即使代码没有任何问题。我的猜测是这里正在发生类似的事情。
【讨论】:
以上是关于Valgrind错误在操作系统中有所不同的主要内容,如果未能解决你的问题,请参考以下文章