Почему Valgrind не нравится мое использование glutCreateWindow?

Я использую следующий код...

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

... Вальгринд дает мне следующее...

==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)

Но что неинициализировано? Переменная title инициализируется значением Title.c_str(), а Title является членом класса, который инициализируется в списке инициализации члена конструктора...

class VimridApplication
{
    // ...

public:
    std::string Title;

    // ...
}

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

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

2 ответа

Решение

Valgrind поставляется с некоторым подавлением ошибок по умолчанию, но это, вероятно, не распространяется на libCLcore.

Инструменты проверки ошибок обнаруживают многочисленные проблемы в базовых библиотеках, таких как библиотека GNU C и клиентские библиотеки X11, которые предварительно установлены в вашей системе GNU/Linux. Вы не можете легко исправить их, но вы не хотите видеть эти ошибки (и да, их много!), Поэтому Valgrind читает список ошибок, которые нужно устранить при запуске. Файл подавления по умолчанию создается скриптом./configure при сборке системы.

Вы можете создавать свои собственные средства подавления ошибок, которые, как вы знаете, не имеют отношения к вашему коду.

Просто игнорируй это; Как вы можете видеть, неинициализированное значение используется намного ниже вашего кода в библиотеке OpenGL, и, вероятно, не ваши данные неинициализированы. Возможно, вы захотите покопаться в этом (это может все еще быть ложным срабатыванием), но вы могли бы также оставить это в покое.

Другие вопросы по тегам