Следующий код для загрузки шейдеров в openGL выдает ошибку повреждения кучи - PullRequest
1 голос
/ 18 мая 2019

Я пишу функцию для разбора кода шейдера на строки c ++, которые компилируется openGL.

ShaderSource LoadShaders(const string &filepath)
{
    std::ifstream file(filepath);

    enum class MODES
    {
        NONE = -1, VS = 0, FS = 1
    };



    string line;
    std::stringstream ss[2];
    MODES mode = MODES::NONE;

    while (getline(file, line))
    {
        if (line.find("#shader") != string::npos)
        {
            if (line.find("vertex") != string::npos)
                mode = MODES::VS;

            else if (line.find("fragment") != string::npos)
                mode = MODES::FS;
        }
        else
        {
            ss[(int)mode] << line << "\n";
        }
    }
    file.close();
    return { CompileShader(GL_VERTEX_SHADER, ss[0].str().c_str()), 
             CompileShader(GL_FRAGMENT_SHADER, ss[1].str().c_str()) };
}

Я получаю ошибку повреждения кучи после случайного блока # 231 в строках std :: ifstream file (filepath);в то время как цикл.

1 Ответ

2 голосов
/ 18 мая 2019

Вы никогда не проверяете, что в

        ss[(int)mode] << line << "\n";

mode является действительным значением. Вы по умолчанию инициализируете его в NONE, который равен -1. Поэтому, если первая строка вашего файла шейдера не соответствует требованиям для установки правильного режима, вы в конечном итоге будете писать вне границ.

...