2016-05-31 1 views
-1

私はヒープを使用する「アンチウィルス」(実際のものではなく、覚えておいてください)を書いています。ヒープを使用する必要があるときは、トピック上のメッセージで壊れます。メッセージ: 「:_crtisvalidheappointer(puserdata)表現」 と、それは機能の実行中に起こるている理由... をコードでは、whileループはこれで彼の第五の繰り返しであるとき、私は本当に知らない : との「デバッグアサートに失敗しました」ライン:Anti_Virus.exeがブレークポイントをトリガしました。 C言語

if (!(results = (char**)realloc(results, sizeof(results) + sizeof(char*)))) 

機能:

void run(char* dir_path, char* virus_path, char mode) 
{ 
    DIR* dir = NULL; 
    FILE* virus = NULL; 
    struct dirent* cur_file; // cur_file is a pointer for struct dirent which represnts the file we are checking now (current file) 
    char** results = NULL; // resullts will be an array of strings to write in the log 
    int results_len = 0, i = 0; 
    char* file_path = NULL; 

    //checks the arguments: 
    if (!(dir = opendir(dir_path))) // argv[1] should be the directory 
    { 
     printf("The path that given as the first argument doesn't point to a directory/"); 
     printf("an error has occurred while opening the directory\n"); 
     return -1; 
    } 
    if (!(virus = fopen(virus_path, "rb"))) 
    { 
     printf("The path that given as the second argument doesn't point to a file/"); 
     printf("an error has occurred while opening the file\n"); 
     closedir(dir); 
     return -1; 
    } 

    //running on the file in the directory: 
    while (cur_file = readdir(dir)) // at the end of the directory readdir() will return NULL 
    { 
     if (!(strcmp(cur_file->d_name, "."))) // at the first time wer'e reading from a directory the value of d_name will be "." 
     { 
      continue; 
     } 
     if (!(strcmp(cur_file->d_name, ".."))) //at the second time wer'e reading from a directory the value of d_name will be ".." 
     { 
      continue; 
     } 

     if (!(file_path = (char*)malloc(strlen(dir_path) + cur_file->d_namlen + 2))) //1 for \ between dir_path and d_name and 1 for the NULL 
     { 
      closedir(dir); 
      fclose(virus); 
      return -1; 
     } 
     strcpy(file_path, dir_path); 
     strcat(file_path, "\\"); 
     strcat(file_path, cur_file->d_name); 
     if (!(results)) // if results == NULL -> if didn't allocated memory for results already 
     { 
      if (!(results = (char**)malloc(sizeof(char*)))) 
      { 
       printf("Problem with malloc\n"); 
       free(file_path); 
       closedir(dir); 
       fclose(virus); 
       return -1; 
      } 
     } 
     else 
     { 
      if (!(results = (char**)realloc(results, sizeof(results) + sizeof(char*)))) 
      { 
       printf("Problem with realloc\n"); 
       for (i = 0; i < results_len; i++) 
       { 
        free(results[i]); 
       } 
       free(file_path); 
       free(results); 
       closedir(dir); 
       fclose(virus); 
       return -1; 
      } 
     }  
     results[results_len] = check_file(file_path, virus, mode); 
     if(results[results_len] == -1) // results_len will be updated later (just malloced) 
     { 
      for (i = 0; i < results_len; i++) 
      { 
       free(results[i]); 
      } 
      free(file_path); 
      free(results); 
      closedir(dir); 
      fclose(virus); 
      return -1; 
     } 
     results_len++; 
     free(file_path); 
    } 
    fclose(virus); 
    closedir(dir); 
    write_to_log(dir_path, virus_path, mode, results, results_len); 
} 

関数check_fileは、check_fileにmallocされたchar *(文字列)を返し、他の関数では空きになります。

誰かが理由を知っていますか?

 if (!(results = (char**)realloc(results, sizeof(results) + sizeof(char*)))) 

resultsの大きさが増加していない(したがって、あなたがresult_len増加すると、それの端部の上に踏みされている):

+4

sizeofは、あなたが思っていることをしません(文字列のメモリサイズを教えてくれません)。おそらくstrlenが必要です。 – Max

+0

ああ私はとても馬鹿だ、ありがとう!あなたは非常に助けてくれました。プログラムはより良くなりましたが、ほとんど全てをやっていましたが、既に少しのバグがありました(ブレークポイントを引き起こしました)。そして今はrealloc行にあります。 (結果)+ sizeof(char *)))) – saar

+0

コードの重複を避ける代わりに、エラー処理を改善する必要があります - コードを辿るのが難しくなります –

答えて

0

このラインありがとうございました。すでにresultsに文字列の数を格納しているので、おそらく(result_len + 1)*sizeof(char*)を使用します。

関連する問題