有没有办法测试无效的内存位置?

时间:2010-07-16 09:28:00

标签: c memory-management

在像C这样的语言中,例如,如果例程接收到指针,是否有任何系统调用或其他测试可以应用于指针以检查它是否是有效的内存位置,而不是捕获SIGSEGV或等效的?

3 个答案:

答案 0 :(得分:1)

不,您无法确定地址是否无效。即使您使用某些操作系统函数来测试地址空间是否已映射到地址空间,您仍然无法确定该地址是否属于您不应阅读或修改的某些服务数据。

一个很好的例子。如果您的程序使用Microsoft RPC接受来自其他程序的调用,则必须实现一组回调函数来为请求提供服务。这些回调函数将在RPC启动的独立线程上运行。你不知道那些什么时候开始以及它们的堆栈大小是什么,所以你不能检测是否发生了缓冲区溢出,如果你写的是一个堆栈变量的地址但是意外地是另一个堆栈的堆栈线程。

答案 1 :(得分:0)

好吧,如果您知道存储指向的内存(例如,在堆栈中),您可以检查它是否在某个“范围”内,即该堆栈的大致地址范围。如果你知道你的堆“应该”有多大,这对堆上的东西也有用。它绝对不是一种自动防故障方法,但我并不知道有任何确定方法来检查指针的“有效性”。

答案 2 :(得分:0)