C++ Valgrind与OpenGL
我编写了一个简单的OpenGL应用程序,并决定使用valgrind进行测试。并收到以下信息: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
==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:
MyreadShader
函数:
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的错误?