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;
}
Sehen Sie, wenn Sie Ihren Code auf das Wesentliche eingrenzen können. – gspr
Ü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 :-) –