有没有办法只读标记一块已分配的内存?

par*_*cle 48 c c++ malloc memory-management heap-corruption

如果我分配一些内存使用malloc()是否有一种方法来标记它只读.因此,如果有人试图写入memcpy()会失败吗?

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

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

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

为了类比,假设有人从sqlite语句中获取blob列,然后回写它.虽然在sqlite的情况下,它没有意义,但在我们的情况下这有点讨厌.

NPE*_*NPE 60

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

相关的API是:

您需要确保内存页面不包含任何您不想使其成为只读的内容.要做到这一点,您要么必须过度使用malloc(),要么使用不同的分配API,例如mmap(),posix_memalign()VirtualAlloc().

  • 不只是Linux,而是在所有提供内存保护扩展的POSIX操作系统上:http://pubs.opengroup.org/onlinepubs/009604499/functions/mprotect.html (7认同)

Nik*_* C. 36

取决于平台.在Linux上,您可以使用mprotect()(http://linux.die.net/man/2/mprotect).

在Windows上,您可以尝试VirtualProtect()(http://msdn.microsoft.com/en-us/library/windows/desktop/aa366898 (v=vs.85) .aspx).我从来没用过它.

编辑:这不是NPE答案的重复.NPE最初有不同的答案; 它是后来编辑的,并添加了mprotect()和VirtualProtect().


Rae*_*ald 5

错误的api设计,其中用户错过了使用方法GetValue()返回的const指针,该方法是大型内存结构的一部分。由于我们要避免复制大块内存,因此我们在特定格式的结构化内存中返回活动指针

显然不是错误的API设计。API是一种契约:您保证您的类将以特定的方式运行,该类的客户保证以适当的方式使用API​​。诸如此类的肮脏技巧const_cast是不正确的(并且在某些情况下,但并非在所有情况下,都有未定义的行为)。

如果使用API const_cast导致安全性问题,那是错误的API设计。在这种情况下,您必须复制内存块或重新设计API。这是Java中的规范,它没有的等同const规范(尽管const在Java中是保留字)。