2012-04-05 10 views
0

Ich verwende fgets(), Zeilen aus der Datei zu lesen. Ich kann ein paar Zeilen der Datei lesen, dann gibt fgets() eine Zugriffsverletzung zurück. Man würde erwarten, dass es ein Problem mit meinem Dateipuffer gibt, aber wie Sie in meinem Code sehen können, ist das nicht der Fall. Ein merkwürdiges Verhalten, das mir auffiel, war, dass ich keine Probleme habe, wenn ich alle Zeilen der Datei in einer engen Schleife lese und drucke. Ich habe einige printf() - Anweisungen verwendet, um dieses Problem zu beheben, und habe festgestellt, dass die Dateiposition unterschiedlich ist, je nachdem, welche Schleife ausgeführt wird. Die FILE * wird in meiner "full loop" Logik nicht berührt.fgets funktioniert dann gibt Zugriffsverletzung zurück

Die enge Schleife Datei Positionen gehen: 0, 27, 53, 80, 82, 99, 127, 155, usw.

Die vollständige Datei Positionen Schleife gehen: 0, 27, 53, 80, 82, Datei 99, 138

Eingang:

!!!!!!!!!!!!!!!!!!!!!!!!! 
! Test sparc gagdet file 
!!!!!!!!!!!!!!!!!!!!!!!!! 

! instruction 1 
1: subcc  %g0, %i4, %i4 
1: subc  %g0, %i4, %i4 ** access violation reading this line ** 

! instruction 2 
** etc. ** 

Code:

/* 
* parse_profile: Parse the gadget profile and load the memory structures required to scan the library file 
*/ 
int parse_profile(FILE * gadget_file, struct g_handle * gadget_handle){ 

// Buffers used to temporarily store file imput 
char op_code [NODE_BUF_SIZE] = "\0"; 
char reg [NODE_BUF_SIZE] = "\0"; 

// Reference nodes in the bod_ops and save_regs lists 
struct char_node * temp_node = NULL; 
struct char_node * op_node = NULL; 
struct char_node * reg_node = NULL; 

// 
int level = 1; 
int old_level = 1; 
int curr_line = 0; 

// A buffer to hold file data 
char file_buffer [PAGE_SIZE]; 

// Reference nocdes in the instruction tree 
struct instruction_node * current_node = NULL; 
struct instruction_node * prev_node = NULL; 
struct instruction_node * prev_level = NULL; 

// Read a line from the gadget file (data for a single instruction) 
//while(fgets(file_buffer, PAGE_SIZE, gadget_file) != NULL){ 
char * shiz = file_buffer; 
while(shiz != NULL){ 
printf("\n file location: %d", ftell(gadget_file)); 
fflush(stdout); 
shiz = fgets(file_buffer, PAGE_SIZE, gadget_file); 
/* 
// tight loop with different file position 
while(shit != NULL){ 
printf("\n file location: %d", ftell(gadget_file)); 
fflush(stdout); 
shiz = fgets(file_buffer, PAGE_SIZE, gadget_file); 
} 
*/ 
    // Increment the current line 
    curr_line = curr_line + 1; 
printf("\nline (%d)", curr_line); 
fflush(stdout);  
    // Ensure we have gathered the entire line of the file 
    if(strlen(file_buffer) >= PAGE_SIZE){ 

     // We have exceeded the maximum line size, quit 
     printf("\nError reading gadget profile, Line %d: Maximum line length of 4096 has been exceeded", curr_line); 
     return(-1); 

    } // Ensure we have gathered the entire line of the file 

    // If this is a comment 
    if(*file_buffer == '!'){ 

     // Do nothing 
    } 
    // If this is a blank line 
    else if(sscanf(file_buffer," %s ") < 1){ 

     // Do nothing 
    } 
    // Scan the current line until we have saved all instructions 
    else if(sscanf(file_buffer,"%d: %s", &level, op_code) == 2){ 
printf("\n file location: %d", ftell(gadget_file)); 
fflush(stdout); 
printf("1"); 
fflush(stdout);  
     // Store instruction information 
/*  
commented block 
*/ 
    } // Scan the current line until we have saved all instruction/nibble pairs 

    // Scan the current line until we have saved all registers to be preserved 
    else if(sscanf (file_buffer,"r: %s", reg) == 1){ 
/* 
commented block 
*/   
    } // Scan the current line until we have saved all registers to be preserved 

    // Scan the current line until we have saved all op_codes to be avoided 
    else if(sscanf (file_buffer,"o: %s", op_code) == 1){ 
/* 
commented block 
*/ 

    } // Scan the current line until we have saved all op_codes to be avoided 

    else{ 

     // quit 
     printf("\nError reading gadget profile, Line %d: \n%s", curr_line, file_buffer); 
     return(-1); 
    } 
printf("7"); 
printf("\n file location: %d", ftell(gadget_file)); 
fflush(stdout);  
} // Read a line from the gadget file (data for a single instruction) 
printf("a"); 
fflush(stdout);  
// If fread() returned an error, exit with an error 
if(ferror(gadget_file) != 0){ 

    // Print error and exit 
    printf("\nError reading gadget profile"); 
    return(-1); 

} // If fread() returned an error, exit with an error 

return 0; 
} 
+2

Sehen Sie, wenn Sie Ihren Code auf das Wesentliche eingrenzen können. – gspr

+0

Überprüfen Sie den Rückgabewert von fgets, bevor Sie 'file_buffer' verwenden; beende 'file_buffer' mit '\ 0', bevor du String-Funktionen verwendest (strlen etc); bereinigen Sie den Code, um ihn lesbar zu machen (z. B. Löschen vieler überflüssiger Kommentare, z. B. beim Beenden von '}'). Dann versuche es nochmal :-) –

Antwort

1

Sie haben undefined Ergebnisse auf der Linie

else if(sscanf(file_buffer," %s ") < 1){ 

Die Anzahl der Formatbezeichner übersteigt die Anzahl der übergebenen Zeiger. Es ist durchaus möglich, dass die sscanf versucht, das Scan-Ergebnis an der beliebigen Stelle zu speichern, deren Bitmuster an der falschen Stelle war.

+0

Das hat das Problem behoben. Vielen Dank!! –