что не так со следующим кодом - PullRequest
0 голосов
/ 09 марта 2012

Следующая функция получает смещения файла из структуры rabin_polynomial , открывает input_file для генерации отпечатка md5 и записывает результат в fpfile

Моя проблема в том, что иногда кажется, что он использует один и тот же контент chunk_buffer , что он генерирует похожие отпечатки для кусков с разными длинами.

В чем может быть причина?

Я протестировал функцию md5 с другими входами отдельно, и она генерирует правильные дайджесты.

   int write_rabin_fingerprints_to_binary_file(FILE *fpfile,FILE *input_file,
    struct rabin_polynomial *head)
{        
    struct rabin_polynomial *poly=head;
    unsigned char fing_print[33]={'\0'};
    size_t bytes_read;
      while(poly != NULL)
        {    
       char *chunk_buffer;
       chunk_buffer = (char*) malloc ((poly->length));  
       bytes_read=fread (chunk_buffer,1, poly->length,input_file);          
               if(bytes_read!=poly->length)
                {
                   printf("Error reading from%s ",input_file);
                   return -1;
                }
       strncpy((char*)fing_print,md5(chunk_buffer).c_str(),32);     
       size_t ret_val=fprintf(fpfile, "%llu\t%lu\t%s\n",poly->start,
                                       poly->length,fing_print);

              if(ret_val == 0)
               {
                  fprintf(stderr, "Could not write rabin polynomials to file.");
                  return -1;
               }

         poly=poly->next_polynomial;
      free(chunk_buffer);
        }

   return 0;
}

EDIT:

Я запускаю эту программу с использованием Visual Studio 2010. Может ли приведение типа к char * в строке malloc () создать проблему?

Количество прочитанных байтов такое же, как указано в аргументе.

Ответы [ 2 ]

1 голос
/ 09 марта 2012

В коде не было ничего плохого, чтобы вызвать такие ошибки.Я только что узнал, что это произошло из-за строк нулевой длины , которые также называются файловыми дырами .

0 голосов
/ 09 марта 2012
   int write_rabin_fingerprints_to_binary_file(FILE *fpfile,FILE *input_file
     , struct rabin_polynomial *head)
{        
    struct rabin_polynomial *poly;
    unsigned char fing_print[33];

    for (poly=head; poly != NULL;poly=poly->next_polynomial )   {    
       char *chunk_buffer;
       int retval;

       chunk_buffer = malloc (1+poly->length);  
       retval = fread (chunk_buf,1, poly->length,input_file);

            /* check retval here */

       chunk_buff[poly->length] = 0;     
       strncpy(fing_print,md5(chunk_buffer).c_str(), sizeof fing_print);
       fing_print[sizeof fing_print -1] = 0;
       retval = fprintf(fpfile, "%llu\t%lu\t%s\n"
                      ,poly->start, poly->length, fing_print);

              if(retval <= 0)
               {
                  fprintf(stderr, "Could not write rabin polynomials to file.");
                  return -1;
               }
        free(chunk_buffer);
        }

   return 0;
}
...