glGetInfoLog() giving unreadable errors

Shader::~Shader() {


unsigned int Shader::CompileShader(unsigned int type, const std::string& source)
	unsigned int id = glCreateShader(type);
	const char* src = source.c_str();
	glShaderSource(id, 1, &src, nullptr);

	int result;
	glGetShaderiv(id, GL_COMPILE_STATUS, &result);
	if (result == GL_FALSE) {
		int length;
		glGetShaderiv(id, GL_INFO_LOG_LENGTH, &length);
		char* message = (char*)alloca(length * sizeof(char));
		glGetShaderInfoLog(id, length, &length, message);
		std::cout << "Failed to compile " << (type == GL_VERTEX_SHADER ? "vertex" : "fragment") << std::endl;
		std::cout << message << std::endl;
		return 0;


	return id;

int Shader::CreateShader()
	program = glCreateProgram();
	unsigned int vs = CompileShader(GL_VERTEX_SHADER, vertexShader);
	unsigned int fs = CompileShader(GL_FRAGMENT_SHADER, fragmentShader);

	glAttachShader(program, vs);
	glAttachShader(program, fs);

	glDetachShader(program, vs);
	glDetachShader(program, fs);

	return program;

I get an error with:

std::string vertexShader =
			"#version 330 core\n"
			"layout(location = 0) in vec4 position;\n"
			"void main()\n"
			"   gl_Position = position;\n"

		std::string fragmentShader =
			"#version 330 core\n"
			"layout(location = 0) out vec4 color;\n"
			"void main()\n"
			"   color = vec4(1.0, 0, 0, 1.0);\n"

but the errors are:

I am using glad version 4.6 and have set my window flags to 4.6

You have to compile the shader before you can check for compile errors.

Also, if you’re using C++ (like taking std::string), why do you switch to C-isms like alloca instead of using a std::string to store the error? It would have handled this, because a string of length 0 (the info log length when you haven’t done anything with the shader yet) would actually work, whereas alloca with 0 does not.