我有一个访问特定内存并写入的代码 :
*addr = _data;
但是有些情况下,addr
变量可以指向无法读取或写入的无法访问的内存(例如,nullptr
)。在这种情况下,不应执行上面的代码。问题是,如何检查addr
中的内存地址是否有效?我了解到我无法捕获访问冲突异常,我也无法使用IsBadReadPtr
WinAPI函数,因为它基本上没用。我应该如何检查这些案件?
答案 0 :(得分:3)
如果您想知道地址是否可写,请写入。将代码包装在SEH处理程序中,然后从那里获取。
您无法可靠地查询可写性(例如,使用VirtualQuery),因为您的流程'地址空间不断变化。这样做会引入TOCTOU race。
答案 1 :(得分:1)
使用VirtualQuery获取页面保护,并查看指针指向的区域是否可写。
但请注意,这不应该用来掩盖糟糕的设计。确保所有指针和引用在使用时都有效。