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"가 필요한 모든 항목에서 올바르게 채워 졌는지 확인하고 다른 기능도 확인했는지 확인합니다.
도움이 될 것입니다.
이것은 하나씩 오류가있는 것처럼 보입니다. –
오류가보고 된 실행 매개 변수는 무엇입니까? valgrind는 할당 된 블록이 단지'31' double 이었음을 알려줍니다. 실제로 배열 []이 될 것으로 예상되는 크기입니까? – woolstar
내가 Sean에게 말했듯이, 코드를 디버깅하고 읽기 오류가 발견되면 매개 변수의 값은 pos = 8 및 nc = 10입니다. 문제는 배열 [18]이 오류가 발생하기 전에 여러 번 읽혀 값을 올바르게 검색한다는 것입니다 ... 실제로 오류가 발생하는 순간에도 배열에서 값을 가져 오는 것이 정확합니다. – user20679