如果我使用 malloc()
分配一些内存,有没有办法将其标记为只读。那么如果有人尝试写入 memcpy() 会失败?
这与错误的 api 设计有关,在这种设计中,用户错过了使用方法 GetValue()
返回的 const 指针,该方法是大内存结构的一部分。由于我们希望避免复制大块内存,因此我们在具有特定格式的结构化内存中返回实时指针。现在的问题是,一些用户发现黑客通过直接写入此内存并避免调用 SetValue() 进行分配和正确处理我们开发的内存二进制格式来获得工作。尽管有时会发生 hack,但有时会由于对已被用户覆盖的控制标志的错误解释而导致内存访问冲突。
教育用户是一项任务,但现在我们希望代码失败。
我只是想知道我们是否可以简单地防止这种情况。
打个比方,假设有人从 sqlite 语句中得到一个 blob 列,然后写回它。虽然在 sqlite 的情况下它没有意义,但在我们的情况下这有点发生。
最佳答案
在大多数硬件架构上,您只能更改整个 memory pages 上的保护属性。 ;您不能将页面的片段标记为只读。
相关的 API 有:
-
mprotect()
在 Unix 上; -
VirtualProtect()
在 Windows 上。
您需要确保内存页面不包含任何您不想设为只读的内容。为此,您要么必须使用 malloc()
进行过度分配,要么使用不同的分配 API,例如 mmap()
、posix_memalign()
或 VirtualAlloc()
.
关于c++ - 有没有办法将一 block 分配的内存标记为只读?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14931477/