检查我是否可以写入内存

时间:2018-02-09 14:52:18

标签: c++ winapi exception memory access-violation

我有一个访问特定内存并写入的代码 :

*addr = _data;

但是有些情况下,addr变量可以指向无法读取或写入的无法访问的内存(例如,nullptr)。在这种情况下,不应执行上面的代码。问题是,如何检查addr中的内存地址是否有效?我了解到我无法捕获访问冲突异常,我也无法使用IsBadReadPtr WinAPI函数,因为它基本上没用。我应该如何检查这些案件?

2 个答案:

答案 0 :(得分:3)

如果您想知道地址是否可写,请写入。将代码包装在SEH处理程序中,然后从那里获取。

您无法可靠地查询可写性(例如,使用VirtualQuery),因为您的流程'地址空间不断变化。这样做会引入TOCTOU race

答案 1 :(得分:1)

使用VirtualQuery获取页面保护,并查看指针指向的区域是否可写。

但请注意,这不应该用来掩盖糟糕的设计。确保所有指针和引用在使用时都有效。