我收到了问题,试图找出我在我的代码中做错了什么,因为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==
于是节目犯规赛格故障,其实如果我去掉了“打印”在代码我可以看到,错误是在循环索引(i,j)的随机值中找到的,当代码尝试从“array [pos + nc]”读取时发生,但它实际上在该位置读取了正确的值! ! (对于pos和nc的相应值)在valgrind错误之前和valgrind错误之后以及在错误之前多次...所以我在这里完全丢失了。
我检查数组“array”,“xp”和“yp”在所有需要的条目中都被正确填充,并检查了其他函数。
任何帮助将不胜感激。
这看起来像是一个错误的错误。 – 2013-12-11 19:58:49
报告错误的运行参数是什么? valgrind告诉你,分配的块只有'31'加倍。这真的是你期望'array []'的大小? – woolstar
正如我对肖恩所说的......当我发现读取错误时,我调试代码和参数值是pos = 8和nc = 10。问题是数组[18]已经在错误前被多次读取并且正确地检索了值...实际上在错误的时刻,从数组检索的值也是正确的 – user20679