当前位置:  开发笔记 > 编程语言 > 正文

我是否应该担心"条件跳转或移动取决于未初始化的值"?

如何解决《我是否应该担心"条件跳转或移动取决于未初始化的值"?》经验,为你挑选了2个好方法。

如果您使用过Memcheck(来自Valgrind),您可能会熟悉这条消息......

条件跳转或移动取决于未初始化的值

我已经读过这个,当你使用未初始化的值时,它就会发生.

MyClass s;
s.DoStuff();

这样可以工作,因为它s是自动初始化的...所以如果是这样的话,它可以工作,为什么Memcheck告诉我它没有初始化?信息应该被忽略吗?

也许我误解了错误指示我的位置.从Valgrind手册中,实际的错误片段是......

int main()
{
  int x;
  printf ("x = %d\n", x);
}

但是,在我的代码中,我看不到类似的东西.我注意到,堆栈顶部的函数跟踪Memcheck显示我是一个虚函数; 这可能与它有关吗?

==14446== Conditional jump or move depends on uninitialised value(s)
==14446==    at 0x414164: vimrid::glut::GlutApplication::FinishRender() (GlutApplication.cpp:120)
==14446==    by 0x422434: vimrid::demos::filterdemos::FilterDemo3::Render() (FilterDemo3.cpp:260)
==14446==    by 0x412D3D: vimrid::VimridApplication::UpdateAndRender() (VimridApplication.cpp:93)
==14446==    by 0x4144BA: vimrid::glut::GlutApplication::glutHandleDisplay() (GlutApplication.cpp:201)
==14446==    by 0x41486A: vimrid::glut::GlutApplication::glutCallbackDisplay() (GlutApplication.cpp:277)
==14446==    by 0x54D9FAA: (within /usr/lib64/libglut.so.3.8.0)
==14446==    by 0x54DDA4A: fgEnumWindows (in /usr/lib64/libglut.so.3.8.0)
==14446==    by 0x54DA4A3: glutMainLoopEvent (in /usr/lib64/libglut.so.3.8.0)
==14446==    by 0x54DAEB5: glutMainLoop (in /usr/lib64/libglut.so.3.8.0)
==14446==    by 0x413FF8: vimrid::glut::GlutApplication::Run() (GlutApplication.cpp:112)
==14446==    by 0x41249D: vimrid::Launcher::runDemo(vimrid::VimridSettings&) (Launcher.cpp:150)
==14446==    by 0x412767: vimrid::Launcher::Launch(int, char**) (Launcher.cpp:62)

更新1:

我看了一下GlutApplication.cpp:120,看起来未初始化的变量被传递到该行的函数中.简单!



1> rocarvaj..:

您可以将标志添加--track-origins=yes到valgrind,它将为您提供有关未初始化数据源的信息.它运行速度较慢,但​​可能会有所帮助.

来源:Valgrind用户手册



2> JaredPar..:

你能发布更完整的样本吗?很难看出在某种形式的goto或flow changing语句中会出现特定错误.

我最常见的代码如下所示

MyClass s1;
...
if ( someCondition ) { 
  goto Foo:
}
MyClass s2;
Foo:
cout << s2.GetName();

这段代码基本上是不正确的.原因是即使s2有一个构造函数,如果someCondition为true,它也不会被执行.goto语句将跳过初始化,并且在程序的最后一行s2将是未初始化的并且基本上指向垃圾.

编辑

您可能还想查看此页面,其中提供了有关如何解密此特定valgrind错误的提示

https://computing.llnl.gov/code/memcheck/#deciphering4

附录

我刚刚发现的另一个常见原因是当你将一些整数常量传递给一个可变函数时,它们作为整数被放在堆栈中,但是当被调用者得到它时,你就会遇到问题64-钻头机器.

我几乎要放弃了,只考虑valgrind是愚蠢的,然后我意识到只需将它转换为长期修复它.

所以我的结论是:认真对待这些消息.

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有