Ошибка проверки времени выполнения № 2 - стек вокруг переменной 'x' поврежден

StackOverflow https://stackoverflow.com/questions/268772

  •  06-07-2019
  •  | 
  •  

Вопрос

Я получаю этот сбой проверки во время выполнения по возвращении в следующем коде. Я считаю, что подобный код работает в других местах программы. Есть идеи?

String GetVariableName(CString symbol, CString filepath)
{
    char acLine[512];
    char acPreviousLine[512];
    CString csFile;
    FILE *fp;   

    csFile.Format("%svariables.txt", filepath);

    fp = fopen(csFile, "r");

    if (! fp)
        return("");

    for (;;)
    {
        strcpy(acPreviousLine, acLine);

        // NULL means we are out of lines in the file.
        if (myfgets(acLine, 511, fp) == NULL)
            break;

        // "END" indicates end of file
        if (! strcmp(acLine, "END"))
            break;

        if (! strcmp(acLine, csVarSymbol))
        {
            // Previous line should be variable name
            fclose(fp);

            // Following line results in Check Failure while in Debug mode
            return(acPreviousLine);
        }
    }   
    fclose(fp);
    return("");
}
Это было полезно?

Решение

В приведенном выше примере нет переменной 'x', но я предполагаю, что вы отредактировали сообщение об ошибке!

acLine не инициализирован, поэтому при первом копировании его в acPreviousLine вы копируете все, что происходит в стеке. Это может привести к переполнению буфера и, следовательно, к повреждению стека в некоторых ситуациях - не во всех, потому что вам может повезти и вы найдете нулевое значение в acLine, прежде чем получите 512 байт.

Стек проверяется на наличие повреждений при возврате, потому что есть защитные слова (на этой платформе и конфигурации сборки - я предполагаю, что это для Windows, компиляция на VS в режиме отладки), вставленные вокруг всех переменных стека, чтобы проверить только эту проблему .

Инициализируйте acLine [0] в 0.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top