有人对 Valgrind 错误地报告无效写入有问题吗?我有一个带有这个循环的 C 程序:
void myfunc4(int *myData, ...)
{
int *variable1, *variable2, ii, ss, bb, jj;
...
bb = 0;
for (ii=0; ii<ss; ii++) {
for (jj=0; jj<(variable2[ii]-variable1[ii]+1); jj++) {
myData[bb] = variable1[ii] + jj; /* valgrind reports error is on this line */
bb = bb+1;
}
printf("ss = %d, ii = %d, bb = %d \n", ss, ii, bb);
}
}
我运行 Valgrind 使用,
valgrind --log-file=./logfile --leak-check=full ./myProgram
它列出的第一个也是唯一一个“无效”错误是:
==6135== Invalid write of size 4
==6135== at 0x4090AA: myfunc4 (myfunc4.c:170)
==6135== by 0x408527: myfunc3 (myfunc3.c:168)
==6135== by 0x406CA1: myfunc2 (myfunc2.c:84)
==6135== by 0x410163: myfunc1 (myfunc1.c:133)
==6135== by 0x413726: main (myProgram.c:511)
==6135== Address 0x1077c250 is 209,712 bytes inside a block of size 209,715 alloc'd
==6135== at 0x4A05FDE: malloc (vg_replace_malloc.c:236)
==6135== by 0x408248: myfunc3 (myfunc3.c:119)
==6135== by 0x406CA1: myfunc2 (myfunc2.c:84)
==6135== by 0x410163: myfunc1 (myfunc1.c:133)
==6135== by 0x413726: main (myProgram.c:511)
==6135==
==6135== More than 10000000 total errors detected. I'm not reporting any more.
==6135== Final error counts will be inaccurate. Go fix your program!
Valgrind 指出错误发生在代码行中:
myData[bb] = variable1[ii] + jj;
如果我当时使用 gdb 逐步执行该程序,它运行良好。循环完成之前显示的最后一个 printf 是:
ss = 687, ii = 686, bb = 2690
我似乎无法观察到 Valgrind 之外的任何问题。Valgrind 始终给出此错误,但 gdb 始终显示没有问题。
正如 Valgrind 正确报告的那样,分配的内存myData
是 209712 字节,这是 209712/4 = 52428 个整数的空间(我使用的是 Linux 64 位机器)。从printf
语句中,我可以看到 for 循环以 bb=2690 退出。所以用于数组的最大索引myData[bb]
(Valgrind 抱怨的地方)是myData[2689]
.
谁能阐明我接下来可以看的地方?我整天都在盯着这个。我没有太多使用 Valgrind,我不想称它为谎言,但我在这里做错了吗?非常感谢任何建议。
更新 1
myfunc4()
对inside的调用myfunc3()
是:
int *myData, lengthA;
...
myData = malloc( sizeof(int) * lengthA / 10);
myfunc4(myData);
更新 2
如果我修改循环以包含一个if (bb>10000)
语句,gdb 永远不会测试为真,但 Valgrind 会。编译的程序是一样的。任何人都知道发生了什么?
void myfunc4(int *myData, ...)
{
int *variable1, *variable2, ii, ss, bb, jj;
...
bb = 0;
for (ii=0; ii<ss; ii++) {
for (jj=0; jj<(variable2[ii]-variable1[ii]+1); jj++) {
myData[bb] = variable1[ii] + jj;
bb = bb+1;
if (bb>10000) {
printf("bb=%d \n", bb); /* valgrind executes this line but gdb does not */
exit(1);
}
}
printf("ss = %d, ii = %d, bb = %d \n", ss, ii, bb);
}
}