2013-12-11 44 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== 

于是节目犯规赛格故障,其实如果我去掉了“打印”在代码我可以看到,错误是在循环索引(i,j)的随机值中找到的,当代码尝试从“array [pos + nc]”读取时发生,但它实际上在该位置读取了正确的值! ! (对于pos和nc的相应值)在valgrind错误之前和valgrind错误之后以及在错误之前多次...所以我在这里完全丢失了。

我检查数组“array”,“xp”和“yp”在所有需要的条目中都被正确填充,并检查了其他函数。

任何帮助将不胜感激。

+3

这看起来像是一个错误的错误。 – 2013-12-11 19:58:49

+0

报告错误的运行参数是什么? valgrind告诉你,分配的块只有'31'加倍。这真的是你期望'array []'的大小? – woolstar

+0

正如我对肖恩所说的......当我发现读取错误时,我调试代码和参数值是pos = 8和nc = 10。问题是数组[18]已经在错误前被多次读取并且正确地检索了值...实际上在错误的时刻,从数组检索的值也是正确的 – user20679

回答

0

要说明@ H2CO3的评论find()可能不会给你你期望的值或nc是不正确的。启动调试器并检查情况。

+0

实际上,它给了我一个8的值,nc参数是10(在我运行valgrind的例子上)。奇怪的是,当valgrind说它发现并且错误不是第一次在第18位读取代码时......实际上是第十次...... – user20679