2014-06-14 51 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