告诉 valgrind 一个值实际上被初始化了

Tell valgrind a value is actually initialized

我有一个 valgrind 误报,告诉我条件跳转或移动取决于未初始化的值。

代码是这样的:

//from GenerateTexture:
glGenTextures(1, (GLuint*)&texture_list[texture_pos]);
return texture_list[texture_pos++];

// Usage in another function
if(texture == 0)
    InitTexture(); // First line of function: texture = GenerateTexture();
if(texture == 0) // This is what valgrind complains about
    return;

我是 运行 Ubuntu VM 中的代码,主机是 Windows 并且有一些关于 OGL 库的早期警告,因此我假设 valgrind 无法正确处理 VM。但是我知道纹理被正确初始化并且不想在每次使用 texture.

时被 valgrind 打扰

我如何告诉 valgrind(也许通过代码注释)这是一个误报?我知道抑制文件,但我需要添加每个使用纹理的函数,所以我正在寻找 "cleaner" 替代方案。

编辑:根据 MCVE 的要求:

#include <GL/gl.h>
#include <SDL/SDL.h>
#include <iostream>

int main(int argc, char** argv){
    SDL_Init(SDL_INIT_VIDEO);

    const SDL_VideoInfo* video = SDL_GetVideoInfo( );

    SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 5 );
    SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 5 );
    SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 5 );
    SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16 );
    SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );

    SDL_SetVideoMode( 800, 600, video->vfmt->BitsPerPixel, SDL_OPENGL );

    GLuint tex;
    glGenTextures(1, &tex);
    if(tex) std::cout << "1337";

    return 0;
}

VBox 中的 Valgrind 显示:

==2304== Conditional jump or move depends on uninitialised value(s)
==2304==    at 0xD97E21C: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLpackspu.so)
==2304==    by 0xD94EB90: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLpackspu.so)
==2304==    by 0x400B49: main (test.cpp:46)
==2304==  Uninitialised value was created by a heap allocation
==2304==    at 0x4C2BBA0: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2304==    by 0xD596F91: crAlloc (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD5A8688: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD59840D: crNetConnectToServer (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD59856D: crNetServerConnect (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD94C4F8: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLpackspu.so)
==2304==    by 0xD94A07E: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLpackspu.so)
==2304==    by 0xD94B0EC: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLpackspu.so)
==2304==    by 0xD2CAD09: crSPULoad (in /usr/lib/VBoxOGL.so)
==2304==    by 0xD2CAEC3: crSPULoadChain (in /usr/lib/VBoxOGL.so)
==2304==    by 0xD283FB6: ??? (in /usr/lib/VBoxOGL.so)
==2304==    by 0xD284318: ??? (in /usr/lib/VBoxOGL.so)
==2304== 
==2304== Conditional jump or move depends on uninitialised value(s)
==2304==    at 0xD5939E4: crHashIdPoolAllocId (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD593AF7: crHashtableAllocRegisterKey (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD97E207: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLpackspu.so)
==2304==    by 0xD94EB90: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLpackspu.so)
==2304==    by 0x400B49: main (test.cpp:46)
==2304==  Uninitialised value was created by a heap allocation
==2304==    at 0x4C2BBA0: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2304==    by 0xD596F91: crAlloc (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD5A8688: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD59840D: crNetConnectToServer (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD59856D: crNetServerConnect (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD94C4F8: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLpackspu.so)
==2304==    by 0xD94A07E: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLpackspu.so)
==2304==    by 0xD94B0EC: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLpackspu.so)
==2304==    by 0xD2CAD09: crSPULoad (in /usr/lib/VBoxOGL.so)
==2304==    by 0xD2CAEC3: crSPULoadChain (in /usr/lib/VBoxOGL.so)
==2304==    by 0xD283FB6: ??? (in /usr/lib/VBoxOGL.so)
==2304==    by 0xD284318: ??? (in /usr/lib/VBoxOGL.so)
==2304== 
==2304== Conditional jump or move depends on uninitialised value(s)
==2304==    at 0xD5939FC: crHashIdPoolAllocId (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD593AF7: crHashtableAllocRegisterKey (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD97E207: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLpackspu.so)
==2304==    by 0xD94EB90: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLpackspu.so)
==2304==    by 0x400B49: main (test.cpp:46)
==2304==  Uninitialised value was created by a heap allocation
==2304==    at 0x4C2BBA0: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2304==    by 0xD596F91: crAlloc (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD5A8688: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD59840D: crNetConnectToServer (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD59856D: crNetServerConnect (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD94C4F8: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLpackspu.so)
==2304==    by 0xD94A07E: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLpackspu.so)
==2304==    by 0xD94B0EC: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLpackspu.so)
==2304==    by 0xD2CAD09: crSPULoad (in /usr/lib/VBoxOGL.so)
==2304==    by 0xD2CAEC3: crSPULoadChain (in /usr/lib/VBoxOGL.so)
==2304==    by 0xD283FB6: ??? (in /usr/lib/VBoxOGL.so)
==2304==    by 0xD284318: ??? (in /usr/lib/VBoxOGL.so)
==2304== 
==2304== Conditional jump or move depends on uninitialised value(s)
==2304==    at 0xD593A27: crHashIdPoolAllocId (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD593AF7: crHashtableAllocRegisterKey (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD97E207: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLpackspu.so)
==2304==    by 0xD94EB90: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLpackspu.so)
==2304==    by 0x400B49: main (test.cpp:46)
==2304==  Uninitialised value was created by a heap allocation
==2304==    at 0x4C2BBA0: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2304==    by 0xD596F91: crAlloc (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD5A8688: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD59840D: crNetConnectToServer (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD59856D: crNetServerConnect (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD94C4F8: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLpackspu.so)
==2304==    by 0xD94A07E: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLpackspu.so)
==2304==    by 0xD94B0EC: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLpackspu.so)
==2304==    by 0xD2CAD09: crSPULoad (in /usr/lib/VBoxOGL.so)
==2304==    by 0xD2CAEC3: crSPULoadChain (in /usr/lib/VBoxOGL.so)
==2304==    by 0xD283FB6: ??? (in /usr/lib/VBoxOGL.so)
==2304==    by 0xD284318: ??? (in /usr/lib/VBoxOGL.so)
==2304== 
==2304== Conditional jump or move depends on uninitialised value(s)
==2304==    at 0xD593A29: crHashIdPoolAllocId (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD593AF7: crHashtableAllocRegisterKey (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD97E207: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLpackspu.so)
==2304==    by 0xD94EB90: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLpackspu.so)
==2304==    by 0x400B49: main (test.cpp:46)
==2304==  Uninitialised value was created by a heap allocation
==2304==    at 0x4C2BBA0: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2304==    by 0xD596F91: crAlloc (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD5A8688: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD59840D: crNetConnectToServer (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD59856D: crNetServerConnect (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD94C4F8: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLpackspu.so)
==2304==    by 0xD94A07E: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLpackspu.so)
==2304==    by 0xD94B0EC: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLpackspu.so)
==2304==    by 0xD2CAD09: crSPULoad (in /usr/lib/VBoxOGL.so)
==2304==    by 0xD2CAEC3: crSPULoadChain (in /usr/lib/VBoxOGL.so)
==2304==    by 0xD283FB6: ??? (in /usr/lib/VBoxOGL.so)
==2304==    by 0xD284318: ??? (in /usr/lib/VBoxOGL.so)
==2304== 
==2304== Conditional jump or move depends on uninitialised value(s)
==2304==    at 0xD593A30: crHashIdPoolAllocId (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD593AF7: crHashtableAllocRegisterKey (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD97E207: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLpackspu.so)
==2304==    by 0xD94EB90: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLpackspu.so)
==2304==    by 0x400B49: main (test.cpp:46)
==2304==  Uninitialised value was created by a heap allocation
==2304==    at 0x4C2BBA0: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2304==    by 0xD596F91: crAlloc (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD5A8688: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD59840D: crNetConnectToServer (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD59856D: crNetServerConnect (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD94C4F8: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLpackspu.so)
==2304==    by 0xD94A07E: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLpackspu.so)
==2304==    by 0xD94B0EC: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLpackspu.so)
==2304==    by 0xD2CAD09: crSPULoad (in /usr/lib/VBoxOGL.so)
==2304==    by 0xD2CAEC3: crSPULoadChain (in /usr/lib/VBoxOGL.so)
==2304==    by 0xD283FB6: ??? (in /usr/lib/VBoxOGL.so)
==2304==    by 0xD284318: ??? (in /usr/lib/VBoxOGL.so)
==2304== 
==2304== Conditional jump or move depends on uninitialised value(s)
==2304==    at 0x400B52: main (test.cpp:47)
==2304==  Uninitialised value was created by a heap allocation
==2304==    at 0x4C2BBA0: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2304==    by 0xD596F91: crAlloc (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD5A8688: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD59840D: crNetConnectToServer (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD59856D: crNetServerConnect (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLcrutil.so)
==2304==    by 0xD94C4F8: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLpackspu.so)
==2304==    by 0xD94A07E: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLpackspu.so)
==2304==    by 0xD94B0EC: ??? (in /opt/VBoxGuestAdditions-4.3.14/lib/VBoxOGLpackspu.so)
==2304==    by 0xD2CAD09: crSPULoad (in /usr/lib/VBoxOGL.so)
==2304==    by 0xD2CAEC3: crSPULoadChain (in /usr/lib/VBoxOGL.so)
==2304==    by 0xD283FB6: ??? (in /usr/lib/VBoxOGL.so)
==2304==    by 0xD284318: ??? (in /usr/lib/VBoxOGL.so)

您可以使用 valgrind memcheck 请求 VALGRIND_MAKE_MEM_DEFINED。

http://www.valgrind.org/docs/manual/mc-manual.html#mc-manual.clientreqs 和文件 memcheck.h 了解更多信息。

但是请注意,将某些内容分配给变量并不是证明 该变量已初始化:如果将值分配给 变量本身没有(完全)初始化,那么 'undefinedness' 将被传播。 所以,在声明纹理变量之前,你应该 仔细检查它是否有效 initialised/defined.

您可能例如首先 运行 加上 --track-origins=yes 以获得更多信息 关于未定义值的来源。

或者,您可以交互式地搜索根本原因 使用 valgrind+vgdb 和 gdb,检查例如的定义 texture_list.

http://www.valgrind.org/docs/manual/manual-core-adv.html#manual-core-adv.gdbserver 获取更多信息。