2013-12-11 1 views
1

valgrind에서 내 코드가 읽기 오류를 생성한다고 알려주기 때문에 문제가 발생합니다.Valgrind가 C 코드에서 읽기 오류를보고합니다.

이 문제가있는 기능입니다 :

double func3(double *xp, double *yp, int dims, double *u_b, 
     double *array, int nc) 
    { 
     int i, j, pos; 
     double cx, cy, dx, dy, dist, rx, ry, sx, sy, sxy, trxx, tryy, trxy,ans; 

     //printf("size of n:", dims); 
     sx = sy = sxy = trxy = 0.0; 
     for (j = 0; j < dims; j++) { 
      rxx = ryy = 0.0; 
      for (i = 0; i < dims; i++) { 
      if (i != j) { 
       dx = (xp[i] - xp[j]); 
       dy = (yp[i] - yp[j]); 
       dist = calc(dx, dy); 
       pos = find(u_b, nc, dist); 
       cx = array[pos]; 
     //printf("i,j: %i , %i\n",i,j); 
     //printf("\t xposi = %f\t\t xposj= %f\n",xp[i],xp[j]); 
     //printf("\t yposi = %f\t\t yposj= %f\n",yp[i],yp[j]); 
     //printf("\t dx = %f\t\t dy= %f\n",dx,dy); 
     //printf("\t value of pos: %i value of nc: %i\n", pos, nc); 
       /*problematic line*/ 
       cy = array[pos + nc]; 
     printf("\t cx: %f\t\t cy: %f\n",cx,cy); 
     printf("\n"); 
      } 
      else 
       cx = cy = 1.0; 
      rx += cx; 
      ry += cy; 
      trxy += cx * cy; 
     } 
     sx += rx; 
     sy += ry; 
     sxy += rx * ry; 
    } 

    trxx = (double) dims - sx/dims; 
    tryy = (double) dims - sy/dims; 
    trxy += (sx * sy/dims - 2.0 * sxy)/dims; 
    ans = trxx * tryy/trxy - 1.0; 

    return ans; 
} 

그래서 Valgrind의에서 오류 추적은 다음과 같습니다

==22457== Invalid read of size 8 
==22457== at 0xFBC3076: func3 (funcs.c:90) 
==22457== by 0xFBC3204: func2 (funcs.c:121) 
==22457== by 0xFBC3335: func1 (funcs.c:11) 
==22457== by 0x485A53: do_dotCode (dotcode.c:1722) 
==22457== by 0x4BACF3: Rf_eval.part.13 (eval.c:651) 
==22457== by 0x4BDC6D: do_set (eval.c:1991) 
==22457== by 0x4BAB5B: Rf_eval.part.13 (eval.c:623) 
==22457== by 0x4BDE93: do_begin (eval.c:1620) 
==22457== by 0x4BAB5B: Rf_eval.part.13 (eval.c:623) 
==22457== by 0x4BF40C: Rf_applyClosure (eval.c:1033) 
==22457== by 0x4BA907: Rf_eval.part.13 (eval.c:670) 
==22457== by 0x4BDC6D: do_set (eval.c:1991) 
==22457== Address 0xd68c758 is 0 bytes after a block of size 248 alloc'd 
==22457== at 0x4A0887C: malloc (vg_replace_malloc.c:270) 
==22457== by 0x4E9750: Rf_allocVector (memory.c:2465) 
==22457== by 0x44790E: do_makevector (builtin.c:756) 
==22457== by 0x4B0595: bcEval (eval.c:4700) 
==22457== by 0x4BA83F: Rf_eval.part.13 (eval.c:554) 
==22457== by 0x4BF40C: Rf_applyClosure (eval.c:1033) 
==22457== by 0x4BA907: Rf_eval.part.13 (eval.c:670) 
==22457== by 0x4BC3E1: Rf_evalList (eval.c:2081) 
==22457== by 0x4BAC0C: Rf_eval.part.13 (eval.c:642) 
==22457== by 0x4BDC6D: do_set (eval.c:1991) 
==22457== by 0x4BAB5B: Rf_eval.part.13 (eval.c:623) 
==22457== by 0x4BDE93: do_begin (eval.c:1620) 
==22457== 

그래서 프로그램 나던 SEG 오류, 나는에 "인쇄"의 주석을 해제하면 사실 코드 루프 인덱스 (i, j)에 대해 임의의 값에서 오류가 발견되었으며 코드가 "array [pos + nc]"에서 읽으려고 할 때 발생하지만 실제로 해당 위치에서 올바른 값을 읽습니다! !! !! (pos와 nc의 상응하는 값에 대해) valgrind 에러 전과 valgrind 에러 후 그리고 에러시 ... 나는 completly 여기 잃어버린다.

배열 "array", "xp"및 "yp"가 필요한 모든 항목에서 올바르게 채워 졌는지 확인하고 다른 기능도 확인했는지 확인합니다.

도움이 될 것입니다.

+3

이것은 하나씩 오류가있는 것처럼 보입니다. –

+0

오류가보고 된 실행 매개 변수는 무엇입니까? valgrind는 할당 된 블록이 단지'31' double 이었음을 알려줍니다. 실제로 배열 []이 될 것으로 예상되는 크기입니까? – woolstar

+0

내가 Sean에게 말했듯이, 코드를 디버깅하고 읽기 오류가 발견되면 매개 변수의 값은 pos = 8 및 nc = 10입니다. 문제는 배열 [18]이 오류가 발생하기 전에 여러 번 읽혀 값을 올바르게 검색한다는 것입니다 ... 실제로 오류가 발생하는 순간에도 배열에서 값을 가져 오는 것이 정확합니다. – user20679

답변

0

@ H2CO3의 의견 find()에서 설명하는 바에 따르면 예상 값을 제공하지 않았거나 nc이 올바르지 않을 수 있습니다. 디버거를 가동하고 상황을 검사하십시오.

+0

사실 그것은 8이라는 값을 주며 nc 매개 변수는 10입니다 (예를 들어 valgrind를 실행 한 경우). 이상한 일은 valgrind가 18 번째 위치에서 읽은 코드가 실제로는 10 번째 시점과 같지 않다는 것을 발견했을 때입니다. – user20679