Ошибка проверки времени выполнения № 2 - стек вокруг переменной 'x' поврежден
Вопрос
Я получаю этот сбой проверки во время выполнения по возвращении в следующем коде. Я считаю, что подобный код работает в других местах программы. Есть идеи?
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.