C6385 Чтение неверных данных из 'ss': читаемый размер составляет 352 байта, но можно прочитать '-176' байтов - PullRequest
0 голосов
/ 06 апреля 2020

Я работал над проектом OpenGL в Visual Studio, и у меня было два шейдера в одном файле, фрагментный шейдер и вершинный шейдер, до фрагментного шейдера у меня была строка, в которой был фрагмент #shader, а перед вершинным шейдером - строка #shader vertex, я сделал функцию, которая могла бы анализировать и разделять 2 шейдера, эта функция называлась parseshader

примечание: причина, по которой у меня была структура, в том, что я хотел, чтобы она выводила 2 две строки строка, содержащая вершинный шейдер и строка, содержащая фрагментный шейдер. Я хотел, чтобы он вывел две строки, потому что у меня была другая функция для компиляции шейдера с двумя параметрами: код вершинного шейдера и код фрагментного шейдера

        struct shaderProgramSource
    {
        std::string VertexSource;
        std::string FragmentSource;
    };

    static shaderProgramSource parseShader(const std::string& filepath) {  
        enum class shadertype{
        NONE = -1 ,VERTEX = 0 ,FRAGMENT = 1
    };  
std::ifstream stream(filepath);
std::stringstream ss[2];
shadertype type = shadertype::NONE;
std::string line;
while (getline(stream, line))
{
    if (line.find("#shader") != std::string::npos)
    {
        if (line.find("vertex") != std::string::npos)
            shadertype type = shadertype::VERTEX;
        else if(line.find("fragment") != std::string::npos)
            shadertype type = shadertype::FRAGMENT;

    }
 else
        ss[(int)type] << line << "\n";
}

return { ss[0].str(),ss[1].str() };
    }

проблема в том, что я получаю предупреждение в строке, где я написал ss [(int) type] << line << "\ n"; с надписью <strong> C6385 Чтение неверных данных из 'ss': читаемый размер составляет '352' байта, но можно прочитать '-176' байтов.

Ответы [ 3 ]

1 голос
/ 06 апреля 2020

C6385 - предупреждение о переполнении буфера . Он говорит вам, что у вас есть возможная проблема индексации массива в вашем коде, и это правда!

Если вам не удается найти нужные данные в строке из вашего файла, то вы пытаетесь получить доступ ss[-1], что явно чушь. (Каждый stringstream должен иметь ширину 176 байт в вашей среде на основе указанного c текста предупреждения.) Вы не должны делать это: -1 не является допустимым индексом массива.

Фактически, вы будете делать эту ошибку, даже если вы ранее нашли хорошую строку в файле, потому что вы продолжаете объявлять новые локальные переменные type вместо присвоения существующей.


Если я понимаю Ваш код и цель правильно, я предлагаю следующие изменения:

  1. Удалить shadertype из этих внутренних if операторов, чтобы превратить ваши объявления в присваивания.
  2. Положить if (type != shadertype::NONE) перед вашим доступом ss[(int)type], возможно, сопровождается подтверждением, если вы не ожидаете, что файлы будут вне шаблона.

Кроме того, сделайте ваши отступы согласованными, чтобы ваша программа была более читабельной.


struct shaderProgramSource
{
    std::string VertexSource;
    std::string FragmentSource;
};

static shaderProgramSource parseShader(const std::string& filepath)
{
    enum class shadertype
    {
        NONE     = -1,
        VERTEX   = 0,
        FRAGMENT = 1
    };  

    std::ifstream stream(filepath);
    std::stringstream ss[2];
    shadertype type = shadertype::NONE;

    std::string line;
    while (getline(stream, line))
    {
        if (line.find("#shader") != std::string::npos)
        {
            if (line.find("vertex") != std::string::npos)
                type = shadertype::VERTEX;
            else if(line.find("fragment") != std::string::npos)
                type = shadertype::FRAGMENT;
        }
        else if (type != shadertype::NONE)
        {
            ss[(int)type] << line << "\n";
        }
        else
        {
            // Got non-introductory line out of sequence! Don't know
            // what type to use! Consider asserting, or throwing an
            // exception, or something, depending on how defensive you
            // want to be with respect to the input file format.
        }
    }

    return { ss[0].str(), ss[1].str() };
}
0 голосов
/ 06 апреля 2020

Вы повторно объявили переменную вашего типа

if (line.find("#shader") != std::string::npos)
{
    if (line.find("vertex") != std::string::npos)
        shadertype type = shadertype::VERTEX;
    else if(line.find("fragment") != std::string::npos)
        shadertype type = shadertype::FRAGMENT;

}

должно быть

if (line.find("#shader") != std::string::npos)
{
    if (line.find("vertex") != std::string::npos)
        type = shadertype::VERTEX;
    else if(line.find("fragment") != std::string::npos)
        type = shadertype::FRAGMENT;

}
0 голосов
/ 06 апреля 2020

ASSERT, если тип не является shadertype :: NONE.

Возможно, это даст вам некоторые подсказки.

Из того, что я вижу в вашем коде, есть путь выполнения, в котором он возможный тип, чтобы все еще быть shadertype :: NONE. В этом случае вы разыменовываете плохой индекс.

...