C++ Valgrind与OpenGL

C++ Valgrind与OpenGL,c++,linux,opengl,valgrind,C++,Linux,Opengl,Valgrind,我编写了一个简单的OpenGL应用程序,并决定使用valgrind进行测试。并收到以下信息: ==14679== Memcheck, a memory error detector ==14679== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al. ==14679== Using Valgrind-3.12.0.SVN and LibVEX; rerun with -h for copyright info ==14

我编写了一个简单的OpenGL应用程序,并决定使用valgrind进行测试。并收到以下信息:

==14679== Memcheck, a memory error detector
==14679== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==14679== Using Valgrind-3.12.0.SVN and LibVEX; rerun with -h for copyright info
==14679== Command: ./out/main.o
==14679==
Starting GLFW context, OpenGL 3.3
==14679== Conditional jump or move depends on uninitialised value(s)
==14679==    at 0x4C32EA6: rawmemchr (vg_replace_strmem.c:1402)
==14679==    by 0x63283C1: _IO_str_init_static_internal (strops.c:41)
==14679==    by 0x631BB96: vsscanf (iovsscanf.c:40)
==14679==    by 0x6316306: sscanf (sscanf.c:32)
==14679==    by 0x94B9E4A: ??? (in /usr/lib/x86_64-linux-gnu/libdrm.so.2.4.0)
==14679==    by 0x94BA182: ??? (in /usr/lib/x86_64-linux-gnu/libdrm.so.2.4.0)
==14679==    by 0x94BDBF8: drmGetDevice (in /usr/lib/x86_64-linux-gnu/libdrm.so.2.4.0)
==14679==    by 0x57EE2D6: ??? (in /usr/lib/mesa-diverted/x86_64-linux-gnu/libGL.so.1.2.0)
==14679==    by 0x57ED694: ??? (in /usr/lib/mesa-diverted/x86_64-linux-gnu/libGL.so.1.2.0)
==14679==    by 0x57C1988: ??? (in /usr/lib/mesa-diverted/x86_64-linux-gnu/libGL.so.1.2.0)
==14679==    by 0x57BCF10: glXQueryVersion (in /usr/lib/mesa-diverted/x86_64-linux-gnu/libGL.so.1.2.0)
==14679==    by 0x50943F9: ??? (in /usr/lib/x86_64-linux-gnu/libglfw.so.3.2)
==14679==
==14679==
==14679== HEAP SUMMARY:
==14679==     in use at exit: 45,107 bytes in 460 blocks
==14679==   total heap usage: 18,068 allocs, 17,608 frees, 30,350,802 bytes allocated
==14679==
==14679== LEAK SUMMARY:
==14679==    definitely lost: 448 bytes in 1 blocks
==14679==    indirectly lost: 1,773 bytes in 14 blocks
==14679==      possibly lost: 0 bytes in 0 blocks
==14679==    still reachable: 42,886 bytes in 445 blocks
==14679==         suppressed: 0 bytes in 0 blocks
==14679== Rerun with --leak-check=full to see details of leaked memory
==14679==
==14679== For counts of detected and suppressed errors, rerun with: -v
==14679== Use --track-origins=yes to see where uninitialised values come from
==14679== ERROR SUMMARY: 9 errors from 1 contexts (suppressed: 0 from 0)
==16571== Conditional jump or move depends on uninitialised value(s)
==16571==    at 0x4C2EDA9: strlen (vg_replace_strmem.c:454)
==16571==    by 0x5B22888: std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22)
==16571== Conditional jump or move depends on uninitialised value(s)
==16571==    at 0x6324F29: _IO_file_xsputn@@GLIBC_2.2.5 (fileops.c:1309)
==16571==    by 0x631A0AA: fwrite (iofwrite.c:39)
==16571==    by 0x5B2258D: std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22)
==16571==    by 0x5B22896: std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22)
它与什么有联系,我是否有必要担心

编辑1:

<>我的C++代码:

#include <iostream>
#include "utils/shader_utils.h"

#include <GL/glew.h>
#include <GLFW/glfw3.h>

#include <glm/vec4.hpp>

// Window dimensions
const GLuint WIDTH = 800, HEIGHT = 600;

// Shaders
const char *vertexShader = "src/resources/shaders/vertex_shader.glsl";
const char *fragmentShader = "src/resources/shaders/fragment_shader.glsl";
const char *vertexShaderSource, *fragmentShaderSource;

int main() {
    std::cout << "Starting GLFW context, OpenGL 3.3" << std::endl;
    // Init GLFW
    glfwInit();
    // Set all the required options for GLFW
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);

    // Create a GLFWwindow object that we can use for GLFW's functions
    GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "OpenGL", nullptr, nullptr);
    glfwMakeContextCurrent(window);

    // Set the required callback functions
    glfwSetKeyCallback(window, key_callback);

    glewInit();

    glEnable(GL_DEPTH_TEST);
    glDepthMask(true);

    int width, height;
    glfwGetFramebufferSize(window, &width, &height);
    glViewport(0, 0, width, height);

    vertexShaderSource = readShader(vertexShader);
    fragmentShaderSource = readShader(fragmentShader);

    GLuint vertexShader = compileShader(vertexShaderSource, GL_VERTEX_SHADER);
    // Fragment shader
    GLuint fragmentShader = compileShader(fragmentShaderSource, GL_FRAGMENT_SHADER);
    // Link shaders
    GLuint shaderProgram = createProgram(vertexShader, fragmentShader);
    glLinkProgram(shaderProgram);
    // Check for linking errors
    //getProgramInfoLog(shaderProgram, GL_LINK_STATUS);
    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);

    GLuint VertexArrayID;
    glGenVertexArrays(1, &VertexArrayID);
    glBindVertexArray(VertexArrayID);

    static const GLfloat vertices[] = {
        -1.0f, -1.0f, -0.5f,
        1.0f, -1.0f, -0.5f,
        0.0f,  1.0f, -0.5f,

        -0.5f, -0.5f, -0.6f,
        0.5f, -0.5f, -0.6f,
        1,  0.0f, -0.6f,
    };

    GLuint vertexbuffer;
    glGenBuffers(1, &vertexbuffer);
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    while (!glfwWindowShouldClose(window)) {
        glfwPollEvents();

        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glUseProgram(shaderProgram);
        glEnableVertexAttribArray(0);

        su::pointer(0, 3, vertexbuffer);

        su::setVec3(glGetUniformLocation(shaderProgram, "in_color"), glm::vec3(1, 0, 0));
        glDrawArrays(GL_TRIANGLES, 0, 3);
        su::setVec3(glGetUniformLocation(shaderProgram, "in_color"), glm::vec3(0, 1, 0));
        glDrawArrays(GL_TRIANGLES, 3, 3);

        glDisableVertexAttribArray(0);

        glfwSwapBuffers(window);
    }
    // Properly de-allocate all resources once they've outlived their purpose
    glDeleteBuffers(1, &vertexbuffer);
    glDeleteVertexArrays(1, &VertexArrayID);
    // Terminate GLFW, clearing any resources allocated by GLFW.
    glfwTerminate();

    delete[] vertexShaderSource;
    delete[] fragmentShaderSource;

    return 0;
}
以及其他类似的错误

汇编:

g++ src/main.cpp -o out/main.o `pkg-config --libs glfw3 glew`
编辑2:

如何获取应用程序中内存泄漏的真实数据?接受448为零

编辑3:

My
readShader
函数:

char *readShader(const char *path) {
    FILE *file = fopen(path, "rb");
    fseek(file, 0, SEEK_END);
    size_t size = ftell(file);
    fseek(file, 0, SEEK_SET);
    char *result = new char[size + 1];
    fseek(file, 0, SEEK_SET);
    fread(result, 1, size, file);
    fclose(file);
    result[size] = '\0';
    return result;
}

我将非常感谢您的帮助

您是如何编译和链接该库的?您是如何编译程序并将其链接到库的?另请参阅并注意“不建议使用-O2及以上版本,因为Memcheck偶尔会报告未初始化的值错误,这些错误实际上并不存在”。@rabbi76它返回指向文件内容的指针,该指针带有空终止符,与您的问题无关,但我建议检查返回代码,而不是假设所有函数都成功(例如IO函数)。奇怪的是,错误消息链接到标准库。我对其进行了测试,所有使用OpenGL的程序都有相同的错误。但在这种情况下,我如何在我的代码中找到漏洞?是否有类似Valgrind的错误?