鉴于内存地址不受信任,Linux中是否有办法测试它是否指向有效的可访问内存?
例如,在mach中,您可以使用vm_read_overwrite()尝试从指定位置复制数据。如果地址无效或无法访问,它将返回错误代码而不是崩溃进程。
答案 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
}
但是这个功能可能很慢,不应该用于性能危急情况。