OpenGL getShaderInfoLog Ошибка шины 10

Когда я запускаю следующий код (или любой из вариантов, которые я пробовал), я получаю ошибку шины. Компилируется нормально.

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <fstream>
#include <iostream>
#include <stream>
void main() {
/* * * * * * * * * * * * * * * * * *
* Code that loads the shader file.*
* This works fine, error is later.*
* * * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * * *
* Code that generates OpenGL      *
* shader and compiles it. Works.  *
* * * * * * * * * * * * * * * * * */

// Check for errors compiling shader
bool status;
glGetShaderiv(shaderId, GL_COMPILE_STATUS, &status);
if(status == GL_FALSE) {
// Compiler errors
GLchar* log = (GLchar*) "\0";
GLint len = 0;
GLint rLen = 0;
glGetShaderiv(this->shaderId, GL_INFO_LOG_LENGTH, &len);
// Next line causes bus error 10
glGetShaderInfoLog(this->shaderId, len, &rLen, log);
std::cerr << "Error compiling shader: " << this->filename << ":\n\t" << log << std::endl;
}
}

Я использую его на Mac OSX. Это работает нормально, если glGetShaderInfoLog закомментирован (однако glGetProgramInfoLog вызывает ту же ошибку). Вот некоторая важная информация из отчета о сбое.

Тип исключения: EXC_BAD_ACCESS (SIGBUS)

Коды исключений: KERN_PROTECTION_FAILURE в 0x000000010cd5c0f0

Примечание об исключении: EXC_CORPSE_NOTIFY

Сигнал завершения: Ошибка шины: 10

Причина завершения: Пространство имен SIGNAL, код 0xa

Процесс завершения: обработчик exc [0]

Области VM около 0x10cd5c0f0:

—> __TEXT 000000010ccc4000-000000010cd5f000 [620K] r-x / rwx SM = COW / Users / USER / *

__DATA 000000010cd5f000-000000010cd64000 [20K] rw- / rwx SM = COW / Users / USER / *

0 libsystem_platform.dylib 0x00007fffcc50fefc _platform_memmove $ VARIANT $ Haswell + 92

1 GLEngine 0x00007fffbbeda274 gleGetString + 52

2 GLEngine 0x00007fffbbe22d20 glGetShaderInfoLog_Exec + 141

3 Программа 0x000000010cd357af Shader :: validate () + 127

4 Программа 0x000000010cd35575 Shader :: compile () + 1621

5 Program 0x000000010cd349ed Program :: link () + 45

6 Программа 0x000000010cd3235e Object :: Object (char *, char *, char *, char *) + 222

7 Программа 0x000000010cd32c65 Object :: Object (char *, char *, char *, char *) + 53

8 Программа 0x000000010cd2e7c0 main + 4576

9 libdyld.dylib 0x00007fffcc2ff255 start + 1

-1

Решение

Последний параметр для glGetShaderInfoLog говорит, куда писать лог. Вы передали ему строковый литерал "\0", Вы говорите ему перезаписать этот строковый литерал в файле журнала.

Перезапись строкового литерала — неопределенное поведение; на практике это обычно вызывает сбой вашей программы. Даже если вы можете перезаписать его, вы все равно не предоставите достаточно места.

Вместо этого вы должны выделить место для хранения журнала. Что-то вроде этого:

glGetShaderiv(this->shaderId, GL_INFO_LOG_LENGTH, &len);
vector<char> log(len);
glGetShaderInfoLog(this->shaderId, log.size(), &rLen, log.data());
// to get the log as a C string use log.data()
2

Другие решения

Других решений пока нет …