2012-06-18 60 views
1

我想分配一个数组并设置它,使得内存管理单元保护它之前和之后的页面,所以尝试运行数组边界将会尝试被自动抓住;然后抓住它以便以受控的方式处理错误。设置一个边界保护数组

我怀疑会有一个可移植的解决方案,但是分别在Windows和GCC上分别使用Microsoft C和Linux的最佳平台特定方法是什么?

+1

有(http://blogs.msdn.com/b/oldnewthing/archive/2012/02/10/10266256 [实际用来做这样的事情Windows API函数。 aspx),尽管Windows Vista中的行为已被删除,因为人们不断将其报告为安全漏洞,即使它不是。 –

+1

内存管理单元以页面粒度工作,您可以分配未在页边界上终止的数组 - 在这种情况下,将无法检测到数组末尾与页边界之间对内存的无效访问。 – smichak

+0

啊,它看起来像该功能使用的机制仍然可用,但?这看起来像Windows的解决方案。 - 是的,我想我需要确保在页面边界上分配有问题的数组。 – rwallace

回答

2

实际上,有一种便携的方式来检测软件中的内存分配超限。 Dmalloc提供栅栏柱重写检测

栅栏柱存储器是区域紧接的上方或下方存储器 分配。编写代码在分配下方访问以上或 非常容易 - 特别是在处理数组或字符串时。 该库可以在每个 分配周围的区域中写入特殊值,以便它会在这些区域被覆盖时注意到。

http://dmalloc.com/docs/latest/online/dmalloc_17.html#SEC22

+0

对,谢谢,这看起来像一个很好的便携式解决方案用于调试目的?但是,我在寻找的是确定性的东西,我可以用它从解释器的内部循环中取出一些明确的检查。 – rwallace

+0

还有http://valgrind.org/ –

+0

您也可以为您的目的扩展或自定义GCC编译器(使用插件或MELT扩展)。 http://gcc-melt.org/可能是一个相关的工具来做到这一点。 –