2014-06-14 1 views
0
==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에서 오류가 발생했습니다.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 0x4C2A2DB에서 == 3905 ==를 alloc'd :

우리가 내 alloc_matrix 보면 내가 malloc에이 (/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so에서) malloc에 ​​

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

블록 = float의 크기입니다.

valgrind에 따른 오류는 어디에 있습니까?

+0

'''를 계산할 때'- 1'은 무엇입니까? –

+0

정렬을 위해 여분의 (블록 -1) 바이트가 할당됩니다. – user2975699

+0

'alloc_matrix()'에있는 코드를 살펴볼 필요가 있습니다. malloc 된 메모리의 크기 계산이 잘못되었습니다. – cmaster

답변

3

내 초능력이 라인

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

에서 당신이 수레의 sprime*r - 1 열을 포함하는 각 행을 보유 할 수있는 매트릭스를 할당하는 것을 말한다.

그러나이 *r 열을 포함 것처럼 당신은 매트릭스에 액세스하는이

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

처럼 내부 루프에서

. ( i0에서 *r - 1까지입니다.) *r의 값은 나중에 함수가 끝날 때까지 변경되지 않습니다.

따라서 버퍼의 끝을 지나쳐 쓰기를 시도하고 Valgrind는 불평합니다.

+0

감사합니다. 오류가 발생했습니다. – user2975699