2009-04-19 6 views
1

Ich bin mit dem folgenden Code ...Warum mag Valgrind meine Verwendung von glutCreateWindow nicht?

169: const char *title = Title.c_str(); 
170: glutCreateWindow(title); 

... Valgrind gibt mir die folgende ...

==28841== Conditional jump or move depends on uninitialised value(s) 
==28841== at 0x6FF7A4C: (within /usr/lib64/libGLcore.so.180.44) 
==28841== by 0x6FF81F7: (within /usr/lib64/libGLcore.so.180.44) 
==28841== by 0x7289B36: (within /usr/lib64/libGLcore.so.180.44) 
==28841== by 0x728A757: _nv000133gl (in /usr/lib64/libGLcore.so.180.44) 
==28841== by 0x4EAB9E9: (within /usr/lib64/libGL.so.180.44) 
==28841== by 0x4EAEA81: (within /usr/lib64/libGL.so.180.44) 
==28841== by 0x4EB1D81: (within /usr/lib64/libGL.so.180.44) 
==28841== by 0x4EA782B: glXCreateNewContext (in /usr/lib64/libGL.so.180.44) 
==28841== by 0x54DF9AA: fgOpenWindow (in /usr/lib64/libglut.so.3.8.0) 
==28841== by 0x54DE062: fgCreateWindow (in /usr/lib64/libglut.so.3.8.0) 
==28841== by 0x54DF300: glutCreateWindow (in /usr/lib64/libglut.so.3.8.0) 
==28841== by 0x4146CE: vimrid::glut::GlutApplication::Init() (GlutApplication.cpp:170) 

Aber was ist nicht initialisiert? Die Titel Variable wird mit dem Wert von Title.c_str initialisiert() und Titel ist ein Klasse-Element, das im Konstruktor Initialisierungsliste initialisiert ...

class VimridApplication 
{ 
    // ... 

public: 
    std::string Title; 

    // ... 
} 

VimridApplication::VimridApplication() : 
    Title("Untitled VimridApplication") 
{ 
    // ... 
} 

class GlutApplication : public VimridApplication 
{ 
    // ... 
} 

Antwort

4

Valgrind wird mit einer Standard-Fehlerunterdrückung geliefert, die aber wahrscheinlich nicht libCLcore umfasst.

Die Fehlerüberprüfungstools erkennen zahlreiche Probleme in den Basisbibliotheken, z. B. der GNU C-Bibliothek und den X11-Clientbibliotheken, die auf Ihrem GNU/Linux-System vorinstalliert sind. Sie können diese nicht einfach beheben, aber Sie möchten diese Fehler nicht sehen (und ja, es gibt viele!) Also liest Valgrind eine Liste von Fehlern, die beim Start unterdrückt werden sollen. Eine Standardunterdrückungsdatei wird beim Erstellen des Systems vom Skript ./configure erstellt.

Sie können Ihre eigenen error suppressions erstellen, von denen Sie wissen, dass sie für Ihren Code irrelevant sind.

2

Nur soviel ignorieren; Wie Sie sehen, wird der nicht initialisierte Wert weit unterhalb Ihres Codes in der OpenGL-Bibliothek verwendet, und es ist wahrscheinlich nicht Ihre Daten, die nicht initialisiert ist. Vielleicht möchten Sie sich damit beschäftigen (es kann immer noch ein falsches positives Ergebnis sein), aber Sie können es auch in Ruhe lassen.

+1

Wenn Sie versuchen, die Ursache des Problems zu finden, ist --track-origins praktisch, neu in Release 3.4.0, 2. Januar 2009. Ich hatte das gleiche Problem, und mir wurde gesagt, dass der nicht initialisierte Wert von erstellt wurde eine Stapelzuordnung in fgOpenWindow in libglut. Kann nicht viel dagegen tun (außer einen Patch upstream senden), so dass es sicher unterdrückt werden kann. – jwhitlock