我在与面试官讨论时遇到了这个问题:
如果我从 malloc 分配了 4 个字节的内存。
int *p = (int*) malloc(4);
现在,如果我将指针移动 4 个字节。
p++;
现在指针指向内存,该内存来自 malloc 分配的 4 字节内存。假设此内存具有读写权限。
*p=4;
这意味着指针正在耗尽分配的内存。
现在考虑一种情况,我分配了一些内存,但每当我的指针移出分配并写入该内存时,我都想得到通知,但如何?
我只有malloc和免费使用。
有一个名为 Electric Fence 的库可以做你想做的事。
它会拦截您的恶意调用。它的工作原理是分配内存页并将页面边界准确地放置在分配的内存的末尾。分配后的页面内存未映射。如果程序尝试写入分配的内存,则会生成 SIGSEGV(分段错误)。
C 没有你本地请求的内容,编译器通常不会检测到非静态变量上的越界数组。
在运行时,如果使用 valgrind 和 libebfence 等工具,则可以检测到这些。但是,这些工具仅用于调试而不是发布,因为它们会增加内存压力,CPU使用率和上下文切换。
在编译时,存在分析工具(静态分析)来模拟程序的功能,并尝试检测此类不当行为。
您可以做的是创建自己的数据结构,其中包含长度信息等,并拥有自己的使用此结构的读/写函数。这是PHP和python等高级语言在内部采用的典型方法。