gpt4 book ai didi

c - 需要帮助追踪非法写入。 valgrind 没有注意到它

转载 作者:太空宇宙 更新时间:2023-11-04 01:12:37 26 4
gpt4 key购买 nike

我有一个 C 程序陷入了它不应该陷入的 for 循环,用

运行它

valgrind --tool=memcheck --leak-check=yes a.out

在程序被捕获之前不会返回任何东西。有没有办法更改 valgrind 的设置来帮助我找到 leak ?正如许多人指出的那样,这不会被视为泄漏,抱歉

提前致谢

这是有问题的循环

int clockstate=0;
int clocklength=0;
int datalength=0;
int datastate=0;
int dataloc = 9;

((((some other code that i don't think is important to this part))))

int dataerr[13] = {0};
int clockerr[13] = {0}; // assumes that spill does not change within an event.
int spill=0;
int k = 0;

spill = Getspill(d+4*255+1); // get spill bit from around the middle
//printf("got spill: %d \n", spill); // third breakpoint
for( k = 0; k < 512; k++)
{
// Discardheader(d); // doesnt actually do anything, since it's a header.f
int databit = Getexpecteddata(d+4*k+1);
printf("%d ",k);
int transmitted = Datasample(&datastate, &datalength, d+4*k+2,dataerr,dataloc, databit);
printf("%d ",k);
Clocksample(&clockstate, &clocklength, d+4*k+3,clockerr, transmitted);
printf("%d \n",k);
// assuming only one error per event (implying the possibility of multi-error "errors"
// we construct the final error at the very end of the (outside this loop)


}

打印后循环重复

254 254 254

255 255 255

256 256 1 <- 这就是问题所在

2 2 2

3 3 3

编辑** 所以我已经追踪到它发生的地方,并且在某个时刻

void Clocksample (int* state, int* length, char *d, int *type, int transbit);

我有代码显示 *length = 1; 所以看起来这个命令以某种方式写入 int k。我现在的问题是,这是怎么发生的,为什么它没有将 length 改回我想要的长度,我该如何解决它。如果你愿意,我可以将整个代码发布到 Clocksample

最佳答案

与上次类似,其中一个函数 Clocksample() 这次正在写入不属于该函数应使用的数据/数组的内存。很可能是越界数组写入。注意:这不是内存泄漏,它正在分配然后丢失应该释放的内存块。

k 为 256 时,在调用 Clocksample() 时设置断点。然后进入 Clocksample(),保持监视在 k 上(或 k 使用的内存)。您也可以在分配给 k 的内存上设置一个硬件内存写入断点。如何执行这些操作取决于您使用的调试器。

现在单步执行(或者如果您设置了硬件断点,则运行到 Clocksample() 的返回)并且当 k 更改时,您将获得罪魁祸首。

关于c - 需要帮助追踪非法写入。 valgrind 没有注意到它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8754516/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com