c++ - 有没有办法将一 block 分配的内存标记为只读?

标签 c++ c memory-management malloc heap-corruption

如果我使用 malloc() 分配一些内存,有没有办法将其标记为只读。那么如果有人尝试写入 memcpy() 会失败?

这与错误的 api 设计有关,在这种设计中,用户错过了使用方法 GetValue() 返回的 const 指针,该方法是大内存结构的一部分。由于我们希望避免复制大块内存,因此我们在具有特定格式的结构化内存中返回实时指针。现在的问题是,一些用户发现黑客通过直接写入此内存并避免调用 SetValue() 进行分配和正确处理我们开发的内存二进制格式来获得工作。尽管有时会发生 hack,但有时会由于对已被用户覆盖的控制标志的错误解释而导致内存访问冲突。

教育用户是一项任务,但现在我们希望代码失败。

我只是想知道我们是否可以简单地防止这种情况。

打个比方,假设有人从 sqlite 语句中得到一个 blob 列,然后写回它。虽然在 sqlite 的情况下它没有意义,但在我们的情况下这有点发生。

最佳答案

在大多数硬件架构上,您只能更改整个 memory pages 上的保护属性。 ;您不能将页面的片段标记为只读。

相关的 API 有:

您需要确保内存页面不包含任何您不想设为只读的内容。为此,您要么必须使用 malloc() 进行过度分配,要么使用不同的分配 API,例如 mmap()posix_memalign()VirtualAlloc().

关于c++ - 有没有办法将一 block 分配的内存标记为只读?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14931477/

相关文章:

C++ : Aliases in function argument

c - 如何将堆栈变量对齐到 16 字节边界

c - 释放 C 中 static 关键字定义的动态分配的内存

embedded - zlib 内存使用/性能。具有 500kb 数据

C++ std::thread 结合 C pthread_mutex_t

c++ - Opengl - GLM::Ortho + GLM_COORDINATE_SYSTEM = 奇怪?

c - 我刚开始使用 C,但我真的可以在项目上使用一些帮助

c - 在函数调用之间保留文件指针

memory-management - 迭代数组时内存使用量激增

c++ - 对不适合作为新类提取的私有(private)方法进行单元测试的好方法是什么?