为什么Valgrind不喜欢我使用glutCreateWindow?

时间:2021-07-06 20:57:39

I'm using the following code...

我正在使用以下代码......

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

... Valgrind gives me the following ...

...... Valgrind给了我以下......

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

But what is uninitialized? The title variable is initialized with the value of Title.c_str() and Title is a class member which is initialized in the constructor member initialization list...

但是什么是未初始化的? title变量用Title.c_str()的值初始化,Title是一个类成员,它在构造函数成员初始化列表中初始化...

class VimridApplication
{
    // ...

public:
    std::string Title;

    // ...
}

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

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

2 个解决方案

#1


Valgrind comes with some default error suppression, but that probably does not cover libCLcore.

Valgrind带有一些默认的错误抑制,但这可能不包括libCLcore。

The error-checking tools detect numerous problems in the base libraries, such as the GNU C library, and the X11 client libraries, which come pre-installed on your GNU/Linux system. You can't easily fix these, but you don't want to see these errors (and yes, there are many!) So Valgrind reads a list of errors to suppress at startup. A default suppression file is created by the ./configure script when the system is built.

错误检查工具可以检测基础库中的许多问题,例如GNU C库和X11客户端库,这些库预先安装在GNU / Linux系统上。您无法轻松修复这些错误,但您不希望看到这些错误(是的,有很多错误!)因此,Valgrind会在启动时读取要抑制的错误列表。构建系统时,。/ configure脚本会创建默认抑制文件。

You can create your own error suppressions that you know are irrelevant to your code.

您可以创建自己的错误抑制,您知道这些错误抑制与您的代码无关。

#2


Just ignore this; as you can see, the uninitialized value is used way below your code in the OpenGL library, and it's probably not your data that's uninitialized. You might want to dig into it (it may still be a false positive), but you might as well leave it alone.

只要忽略这一点;正如您所看到的,未初始化的值在OpenGL库中的代码下方使用,并且可能不是您的数据未初始化。你可能想深入研究它(它可能仍然是误报),但你也可以不管它。

#1


Valgrind comes with some default error suppression, but that probably does not cover libCLcore.

Valgrind带有一些默认的错误抑制,但这可能不包括libCLcore。

The error-checking tools detect numerous problems in the base libraries, such as the GNU C library, and the X11 client libraries, which come pre-installed on your GNU/Linux system. You can't easily fix these, but you don't want to see these errors (and yes, there are many!) So Valgrind reads a list of errors to suppress at startup. A default suppression file is created by the ./configure script when the system is built.

错误检查工具可以检测基础库中的许多问题,例如GNU C库和X11客户端库,这些库预先安装在GNU / Linux系统上。您无法轻松修复这些错误,但您不希望看到这些错误(是的,有很多错误!)因此,Valgrind会在启动时读取要抑制的错误列表。构建系统时,。/ configure脚本会创建默认抑制文件。

You can create your own error suppressions that you know are irrelevant to your code.

您可以创建自己的错误抑制,您知道这些错误抑制与您的代码无关。

#2


Just ignore this; as you can see, the uninitialized value is used way below your code in the OpenGL library, and it's probably not your data that's uninitialized. You might want to dig into it (it may still be a false positive), but you might as well leave it alone.

只要忽略这一点;正如您所看到的,未初始化的值在OpenGL库中的代码下方使用,并且可能不是您的数据未初始化。你可能想深入研究它(它可能仍然是误报),但你也可以不管它。