Échec de vérification au moment de l'exécution n ° 2 - La pile autour de la variable 'x' était corrompue

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

  •  06-07-2019
  •  | 
  •  

Question

Je reçois cette erreur de vérification au moment de l'exécution dans le code suivant. Je crois que le code similaire fonctionne bien ailleurs dans le programme. Des idées?

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("");
}
Était-ce utile?

La solution

Il n'y a pas de variable 'x' dans l'exemple ci-dessus, mais je présume que vous avez modifié le message d'erreur!

acLine n’est pas initialisé. Par conséquent, la première fois que vous le copiez dans acPreviousLine, vous copiez tout ce qui se trouve sur la pile. Cela peut entraîner un débordement de mémoire tampon et donc une corruption de pile dans certaines situations - pas toutes, car vous pourriez avoir de la chance et trouver une valeur nulle dans acLine avant d’atteindre 512 octets.

La pile est vérifiée au retour, car il y a des mots de garde (sur cette plate-forme et la configuration de construction - que je présume sous Windows, compilant sur VS en mode débogage) insérés autour de toutes les variables de la pile pour vérifier que ce problème existe exactement. .

Initialise acLine [0] à 0.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top