2008-11-06 4 views
3

Je reçois cette erreur de vérification d'exécution à la déclaration dans le code suivant. Je crois que le code similaire fonctionne bien ailleurs dans le programme. Des idées?Échec de vérification au moment de l'exécution n ° 2 - La pile autour de la variable 'x' était corrompue

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

Empiler autour de quelle variable dans l'exemple? – Mathias

Répondre

17

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

acLine n'est pas initialisé, donc la première fois que vous le copiez dans acPreviousLine, vous copiez tout ce qui se trouve sur la pile. Cela peut provoquer un débordement de buffer et donc une corruption de pile dans certaines situations - pas toutes, car vous pourriez avoir de la chance et trouver une valeur null dans acLine avant d'atteindre 512 octets. La pile est vérifiée pour la corruption à son retour, car il y a des mots de garde (sur cette plate-forme et configuration de construction - que je suppose sur Windows, compilant sur VS en mode debug) insérés autour de toutes les variables de pile pour vérifier problème.

Initialiser acLine [0] à 0.

Questions connexes