0

我正在使用 fgets() 从文件中读取行。我能够读取文件的几行,然后 fgets() 返回访问冲突。人们会认为我的文件缓冲区存在问题,但正如您在我的代码中看到的那样,情况并非如此。我注意到的一个奇怪行为是,如果我在一个紧密的循环中读取并打印文件的所有行,我就没有问题。我使用了一些 printf() 语句来调试这个问题,并注意到文件位置因执行哪个循环而异。我的“完整循环”逻辑中没有触及 FILE *。

紧密循环文件位置为:0、27、53、80、82、99、127、155 等。

完整的循环文件位置:0、27、53、80、82、99、138

输入文件:

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

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

! instruction 2
** etc. **

代码:

/*
* 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;
}
4

1 回答 1

1

您在线上有未定义的结果

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

The number of format specifiers exceeds the number of pointers passed. It is quite possible that the sscanf tries to store the scan result at the arbitrary location whose bit-pattern was in the wrong place.

于 2012-04-05T15:38:14.060 回答