有时,我会遇到如下所示的off-by-one错误:
unsigned int* x = calloc(2000, sizeof(unsigned int));
printf("%d", x[2000]);我已经超出了分配区域的末尾,所以我在运行时得到了一个EXC_BAD_ACCESS信号。我的问题是:如何检测到这一点?这似乎只是默默地返回垃圾,因为我只差了一个字节,而不是,比方说,一整页。系统的哪个部分阻止我只返回x + 2000中的垃圾字节
发布于 2011-12-10 05:57:02
内存系统在其内存字段的开头和结尾都有标记值,超出了分配的字节数。当您释放内存时,它会检查这些值是否完好无损。如果不是,它会告诉你。
发布于 2011-12-10 06:24:16
也许您只是幸运,因为您使用2000作为大小。根据int的大小,总大小可以被32或64整除,因此很有可能它的末尾会真正终止“真正”的分配。尝试使用一些奇数个字节(最好使用char数组),看看您的系统是否仍能检测到它。
在任何情况下,您都不应该依赖于以这种方式找到这些bug。总是使用valgrind或类似的来检查你的内存访问。
https://stackoverflow.com/questions/8452140
复制相似问题