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

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

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("");
}

1 Ответ

17 голосов
/ 06 ноября 2008

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

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

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

Инициализировать acLine [0] до 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...