2008-11-06 3 views
3

Я получаю эту проверку времени выполнения при возврате в следующем коде. Я считаю, что подобный код работает отлично в другом месте программы. Есть идеи?Ошибка проверки времени выполнения # 2 - поврежден стек вокруг x '0'

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

Уложить вокруг какой переменной в примере? – Mathias 2008-11-06 14:00:25

ответ

17

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

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

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

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