2012-07-02 50 views
0

的無效讀我不能找到在這個代碼中的錯誤,林看着它幾個小時... Valgrind的說:Valgrind的錯誤:大小1

==23114== Invalid read of size 1 
==23114== Invalid write of size 1 

我試圖調試一些printfs輸出,並且我認爲錯誤在這個函數中。

void rdm_hide(char *name, Byte* img, Byte* bits, int msg, int n, int size) 
{ 
    FILE *fp; 
    int r;/ 
    Byte* used; 
    int i = 0, j = 0; 
    int p; 

    fp = fopen(name, "wb"); 

    used = malloc(sizeof(Byte) * msg); 


    for(i = 0; i < msg; i++) 
     used[i] = -1; 


    while(i < 3) 
    { 
     if(img[j] == '\n') 
      i++; 
     j++; 
    } 

    for(i = 0; i < msg; i++) 
    { 
     r = genrand_int32(); 
     p = r % n; 

     if(!search(p, used, msg)) 
     { 
      used[i] = (Byte)p; 

      if(bits[i] == (Byte)0) 
       img[j + p] = img[j + p] & (~1); 
      else if(bits[i] == (Byte)1) 
       img[j + p] = img[j + p] | 1; 
     } 
     else 
      i --; 
    } 

    for(i = 0; i < size; i++) 
     fputc((char) img[i], fp); 

    fclose(fp); 
    free(used); 
} 

感謝您的幫助!

+0

你可以運行valgrind選項** - read-var-info = yes **並共享輸出? – tuxuday

+0

當你正在寫入和讀取img指向的數組時,它可能正在發生。使用gdb來查明它正在發生什麼行。 – sj755

回答

0

==23114== Invalid read of size 1
==23114== Invalid write of size 1

我敢肯定,這不是所有的valgrind說。

你應該

  1. 建立與調試信息(最有可能-g標誌)程序。這會讓valgrind告訴你究竟是哪一行觸發無效讀寫
  2. 如果問題不明顯,編輯你的問題,包括整個 valgrind輸出。
  3. 重新運行valgrind --track-origins=yes your-exe可能會提供其他有用的信息。

最後,你的算法出現是完全虛假的。據我所知,j在第一個while循環之後變成3,並且在此之後從未改變(在這種情況下,您應該只使用const int j = 3;並廢除j++)。此外,您還參考img[j + p],其中p介於0n之間。如果n確實是img的大小,那麼限制之外的j + p索引並不意外,並觸發這兩個錯誤。