Valgrind:libnvidia-glcore.so.346.47条件跳转或移动取决于未初始化的值

马修·霍根(Matthew Hoggan)

在针对与NVIDIA libGL.lib链接的动态库中运行测试c ++应用程序时,我收到了Valgrind报告的以下错误(请参见下文)。我很想压制它们,但是我不确定这是我的问题还是libnvidia-glcore.so的问题。部分不确定的词干是因为无法完全理解Valgrind的输出。我在调用中调查了代码中可能未初始化的变量,glXCreateContextAttribsARB但没有看到任何变量如果从输出到我的问题,我正在寻找什么类型的东西?我遇到的两个错误是:

==10156== Conditional jump or move depends on uninitialised value(s)
==10156==    at 0x7E4CAF4: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156==    by 0x7DEE0CD: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156==    by 0x7DEEADC: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156==    by 0x7F75DA1: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156==    by 0x7F775D3: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156==    by 0x7E279BE: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156==    by 0x7E27D21: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156==    by 0x7F760F5: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156==    by 0x7F3E353: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156==    by 0x7A8C9C0: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156==    by 0x4E535F2: opengl_core::render_system::init() (x11_render_system.cpp:92)
==10156==    by 0x4040D8: test_render_system::run() (test_x11_render_system.cpp:10)
==10156==  Uninitialised value was created by a heap allocation
==10156==    at 0x4C29BCF: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==10156==    by 0x5116428: ??? (in /usr/lib64/nvidia/libGL.so.346.47)
==10156==    by 0x7EECF2E: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156==    by 0x7E479C1: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156==    by 0x7DC8C31: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156==    by 0x50BF331: ??? (in /usr/lib64/nvidia/libGL.so.346.47)
==10156==    by 0x50EB72A: ??? (in /usr/lib64/nvidia/libGL.so.346.47)
==10156==    by 0x50EEA87: ??? (in /usr/lib64/nvidia/libGL.so.346.47)
==10156==    by 0x50E47D2: glXCreateContextAttribsARB (in /usr/lib64/nvidia/libGL.so.346.47)
==10156==    by 0x4E52EF8: opengl_core::render_context::init(opengl_core::render_window&, opengl_core::fb_config&) (x11_render_context.cpp:120)
==10156==    by 0x4E534D0: opengl_core::render_system::init() (x11_render_system.cpp:65)
==10156==    by 0x4040D8: test_render_system::run() (test_x11_render_system.cpp:10)
==10156== 

==10156== Conditional jump or move depends on uninitialised value(s)
==10156==    at 0x7E4CAF4: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156==    by 0x7DEE0CD: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156==    by 0x7DF085F: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156==    by 0x7F4B78B: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156==    by 0x7F4CFBC: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156==    by 0x7E279BE: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156==    by 0x7E27D21: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156==    by 0x7F4BFE0: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156==    by 0x7F38ED5: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156==    by 0x7B20F52: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156==    by 0x7F3E2CB: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156==    by 0x7A8C9C0: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156==  Uninitialised value was created by a heap allocation
==10156==    at 0x4C29BCF: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==10156==    by 0x5116428: ??? (in /usr/lib64/nvidia/libGL.so.346.47)
==10156==    by 0x7EECF2E: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156==    by 0x7E479C1: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156==    by 0x7DC8C31: ??? (in /usr/lib64/nvidia/libnvidia-glcore.so.346.47)
==10156==    by 0x50BF331: ??? (in /usr/lib64/nvidia/libGL.so.346.47)
==10156==    by 0x50EB72A: ??? (in /usr/lib64/nvidia/libGL.so.346.47)
==10156==    by 0x50EEA87: ??? (in /usr/lib64/nvidia/libGL.so.346.47)
==10156==    by 0x50E47D2: glXCreateContextAttribsARB (in /usr/lib64/nvidia/libGL.so.346.47)
==10156==    by 0x4E52EF8: opengl_core::render_context::init(opengl_core::render_window&, opengl_core::fb_config&) (x11_render_context.cpp:120)
==10156==    by 0x4E534D0: opengl_core::render_system::init() (x11_render_system.cpp:65)
==10156==    by 0x4040D8: test_render_system::run() (test_x11_render_system.cpp:10)
==10156== 

按要求:

 // src/x11_render_system.cpp
 91       m_impl->m_context.make_current(m_impl->m_window);
 92       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 93       glClearColor(1.0, 0.0, 0.0, 1.0);  
 94       glXSwapBuffers(display, window);   
 95       m_impl->m_context.make_not_current();
亚历克斯

由于重要的硬件驱动程序(例如GPU驱动程序)的工作方式,Valgrind极容易出现误报。基本上,这些驱动程序通过BIOS设置的用户空间(虚拟RAM)访问GPU的内存(甚至是寄存器)(这是POSIX mmap的工作方式)。这样,驱动程序可以通过任意其他地址一样通过任意地址访问设备的寄存器。

关键是某些设备的寄存器仅用于读取。例如,它们可以反映设备的某些状态。因此,只有设备才有理由写入它们(即使CPU尝试这样做,也会失败)。在大多数情况下,它在加电时在内部进行操作,在状态更改时不时进行操作,并且在设置映射时会反映到用户空间。从本质上讲,这些都是纯易失性变量……比其通常的线程间线程概念更具易变性,而且,Valgrind可以很好地处理它,因为它可以模拟CPU。

但是Valgrind生活在确定性世界(CPU和RAM)中,而这些GPU的寄存器完全不在这个世界中。当驱动程序读取它们时,Valgrind只是认为它正在访问RAM(由于mmap),这绝对不是事实。因此,在驱动程序使用读取的数据(某些设备状态)进行相应分支的点上,Valgrind报告,因为其世界上从未写过该数据。

说实话:专有驱动程序不是开源的,因此很难猜测到底发生了什么,但是可能类似。我可以肯定地说的是,随着时间的流逝(主要是在初始化期间),Valgrind和GPU驱动程序已经发生了很长时间(即使是非常小的程序),并且每个人都认为这是错误的肯定。因此,您可以放心地忽略它...或在项目中为Valgrind创建抑制文件(将其命名为valgrind.supp):

{
  NVidia-driver
  Memcheck:Cond
  obj:/usr/lib64/nvidia/libnvidia-glcore.so.346.47
}

然后,使用选项--suppressions = valgrind.supp调用Valgrind,它将不再报告这些误报。

您可能还有其他与此相关的驱动程序对象,只需为其添加条目(您将不得不重复整个{...}并修改对象行以匹配Valgrind报告的内容)。由于版本更改,您可能还必须在每次更新驱动程序时都更新它们,尽管我想您可以使用基本通配符来避免这种情况。

看看这里对这个Valgrind的功能更多的相关信息。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

查明“条件跳转或移动取决于未初始化的值” valgrind消息

错误:条件跳转或移动取决于未初始化的值-C valgrind

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

Valgrind:使用atomic :: compare_exchange_weak时,条件跳转或移动取决于未初始化的值

如何解决“有条件的跳跃或移动取决于未初始化的值” valgrind错误而导致的strlen错误?

二进制搜索树,Valgrind条件跳转或移动取决于未初始化的值

C ++中的动态数组-条件跳转或移动取决于未初始化的值

释放字符时,“有条件的跳转或移动取决于未初始化的值”

Valgrind:使用哈希函数时,条件跳转或移动取决于未初始化的值

CPP中的Valgrind和内存泄漏:“有条件的跳转或移动取决于未初始化的值”

未初始化条件Valgrind

Valgrind:条件跳转或移动取决于未初始化的值-打开文件

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

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

有条件的跳转或移动取决于未初始化的值和无效的大小写

未初始化的值是由堆栈分配创建的-valgrind

Valgrind-未初始化的值消息

Valgrind:条件跳转,未初始化的值,C ++基本代码

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

Valgrind:未初始化的值

fread() 导致 Valgrind 错误:“条件跳转或移动取决于未初始化的值”

Valgrind 使用未初始化的值和无效读取

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

Valgrind 报告 SIGSEGV 和未初始化值的使用

如何修复C中的“条件跳转或移动取决于未初始化的值”错误

C - 链表 valgrind 未初始化错误取决于添加元素的顺序

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

条件跳转或移动取决于 for 循环中带有 strcat 的未初始化值

Valgrind 消息:条件跳转或移动取决于未解析的未初始化值