测试是否可以在Linux中访问内存

时间:2013-01-24 17:47:44

标签: linux memory

鉴于内存地址不受信任,Linux中是否有办法测试它是否指向有效的可访问内存?

例如,在mach中,您可以使用vm_read_overwrite()尝试从指定位置复制数据。如果地址无效或无法访问,它将返回错误代码而不是崩溃进程。

3 个答案:

答案 0 :(得分:1)

write来自该内存(例如/dev/null(编辑:/dev/null可能无法按预期工作,使用管道)),您将收到{{}如果地址无法访问,则会出现错误。

如果 可写,我不知道如何在不破坏其内容的情况下测试可写内存。

答案 1 :(得分:1)

这是TOCTOU的典型情况 - 你在某些时候检查内存是否可写,然后你尝试写入它,并以某种方式(例如因为应用程序解除分配它),内存是否定的更长的访问。

只有一种有效的方法可以实现这一点,也就是说,当您真正需要使用它时,可以捕获从写入中获得的错误。

当然,您可以使用技巧来判断内存是否“可写”,但实际上您无法确保它是可写的。

您可能想稍微解释一下您实际上要做的事情,如果您更具体,我们可能会有更好的想法。

答案 2 :(得分:0)

您可以尝试使用msync:

int page_size = getpagesize();                                                            
void *aligned = (void *)((uintptr_t)p & ~(page_size - 1));                           
if (msync(aligned, page_size, MS_ASYNC) == -1 && errno == ENOMEM) {
    // Non-accessibe
}

但是这个功能可能很慢,不应该用于性能危急情况。