Error de comprobación en tiempo de ejecución # 2: la pila alrededor de la variable 'x' estaba dañada

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

  •  06-07-2019
  •  | 
  •  

Pregunta

Recibo esta falla de verificación de tiempo de ejecución a la devolución en el siguiente código. Creo que un código similar se está ejecutando bien en otras partes del programa. ¿Alguna idea?

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("");
}
¿Fue útil?

Solución

No hay una variable 'x' en el ejemplo anterior, ¡pero supongo que editó el mensaje de error!

acLine no está inicializado, por lo que la primera vez que lo copie en acPreviousLine, está copiando lo que sea que esté en la pila. Esto puede generar un desbordamiento del búfer y, por lo tanto, acumular corrupción en algunas situaciones, no en todas, porque puede tener suerte y encontrar un valor nulo en acLine antes de llegar a 512 bytes.

La pila se comprueba en busca de daños al regresar, porque hay palabras de protección (en esta plataforma y configuración de compilación, que supongo que está en Windows, compilando en VS en modo de depuración) insertadas alrededor de todas las variables de la pila para verificar solo ese problema .

Inicialice acLine [0] a 0.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top