2014-06-14 92 views
0
從Valgrind的
==3905== ERROR SUMMARY: 14 errors from 2 contexts (suppressed: 2 from 2) 
==3905== 
==3905== 6 errors in context 1 of 2: 
==3905== Invalid write of size 4 
==3905== at 0x401BFE: EliminateXr (in /home/suraj/Desktop/project/fm) 
==3905== by 0x402040: fm_elim (in /home/suraj/Desktop/project/fm) 
==3905== by 0x401395: name_fm (in /home/suraj/Desktop/project/fm) 
==3905== by 0x400C38: main (in /home/suraj/Desktop/project/fm) 
==3905== Address 0x51fc724 is 36 bytes inside a block of size 39 alloc'd 
==3905== at 0x4C2A2DB: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==3905== by 0x401064: alloc_matrix (in /home/suraj/Desktop/project/fm) 
==3905== by 0x401A59: EliminateXr (in /home/suraj/Desktop/project/fm) 
==3905== by 0x402040: fm_elim (in /home/suraj/Desktop/project/fm) 
==3905== by 0x401395: name_fm (in /home/suraj/Desktop/project/fm) 
==3905== by 0x400C38: main (in /home/suraj/Desktop/project/fm) 
==3905== 
==3905== 
==3905== 8 errors in context 2 of 2: 
==3905== Invalid write of size 4 
==3905== at 0x401B17: EliminateXr (in /home/suraj/Desktop/project/fm) 
==3905== by 0x402040: fm_elim (in /home/suraj/Desktop/project/fm) 
==3905== by 0x401395: name_fm (in /home/suraj/Desktop/project/fm) 
==3905== by 0x400C38: main (in /home/suraj/Desktop/project/fm) 
==3905== Address 0x51fce4c is 12 bytes inside a block of size 15 alloc'd 
==3905== at 0x4C2A2DB: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==3905== by 0x401064: alloc_matrix (in /home/suraj/Desktop/project/fm) 
==3905== by 0x401A59: EliminateXr (in /home/suraj/Desktop/project/fm) 
==3905== by 0x402040: fm_elim (in /home/suraj/Desktop/project/fm) 
==3905== by 0x401395: name_fm (in /home/suraj/Desktop/project/fm) 
==3905== by 0x400C38: main (in /home/suraj/Desktop/project/fm) 
==3905== 
--3905-- 
--3905-- used_suppression:  2 dl-hack3-cond-1 
==3905== 
==3905== ERROR SUMMARY: 14 errors from 2 contexts (suppressed: 2 from 2) 

我得到的錯誤。Valgrind的無效寫

它說錯誤位於EliminateXr,但我不能真正看到錯誤。 EliminateXr:

void EliminateXr(float** t,float* q,float*** tnew,float** qnew,int n1,int n2,int* r,int* s,int sprime){ 

    float** matrix = (float**)alloc_matrix(sprime,(*r)-1, sizeof(float)); 
    float* vec= (float*)malloc(sprime*sizeof(float)); 
    int matrixIndex=0; 
    int i,k,l; 
    for(k = 0; k < n1; ++k){ 
     for(l = n1; l < n2; ++l){ 
      for(i=0; i < *r; ++i){ 
       matrix[matrixIndex][i]=t[k][i]-t[l][i]; 
      } 
      vec[matrixIndex]=q[k]-q[l]; 
      matrixIndex++; 
     } 
    } 
    for(k = n2; k < *s; ++k){ 
     for(i=0; i < *r; ++i){ 
      matrix[matrixIndex][i]=t[k][i]; 
     } 
     vec[matrixIndex]=q[k]; 
     matrixIndex++; 
    } 
    *tnew=matrix; 
    *qnew=vec; 
    *r=(*r)-1; 
    *s=sprime; 

} 

我浮法分配內存,所以我不應該得到的大小無效寫4. 誰能解釋,應該怎樣利用這些信息: 地址0x51fc724是大小的塊中36個字節39 alloc'd == == 3905在0x4C2A2DB:的malloc(在/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)

如果我們看一下我的alloc_matrix我有一個malloc

s = m * n * block + m * sizeof(void*) + block - 1; 
p = malloc(s); 

block = float的大小。

根據valgrind的錯誤在哪裏?

+0

計算's'時的' - 1'是什麼? –

+0

對於額外的對齊(塊-1)字節被分配。 – user2975699

+0

您需要查看'alloc_matrix()'中的代碼,計算malloc的內存大小是錯誤的。 – cmaster

回答

3

我的精神力量說,在這條線

float** matrix = (float**)alloc_matrix(sprime,(*r)-1, sizeof(float)); 

你分配能夠保持sprime行花車,含*r - 1列各行的矩陣。

然而,在這樣的

for(i=0; i < *r; ++i){ 
    matrix[matrixIndex][i]=t[k][i]-t[l][i]; 
} 

,就好像它包含*r列您正在訪問矩陣的內部循環。 (i將從0變爲*r - 1)請注意,*r的值在函數結束後纔會更改。

因此,您正在嘗試寫入超過緩衝區的末尾,Valgrind正確地抱怨。

+0

感謝錯誤我現在走了。 – user2975699