安全的realloc方法

7

我正在编写一个C库,需要频繁移动各种敏感数据。我希望在扩展已分配的内存块时(当内存可用时不进行复制),能够擦除旧块内容,同时又能享受realloc带来的好处。

有没有一些轻量级的malloc/realloc/free实现可以用于mingw-gcc或其他技巧?或者只能过度分配并仅仅靠分配和复制而不能依赖realloc?


我猜在大多数情况下,重新分配一个更大的块会导致旧块被复制,因此最好手动使用malloc和free进行操作,而不是依赖于某些第三方“安全”的realloc实现。 - Ian Abbott
2
@CisForCookies 在 realloc 后,旧指针将不再有效(除非它与新指针相同)。 - Ian Abbott
@PSkocik 如果使用mremap,是否会依赖于系统在其选择的时间擦除旧内存块(如果它导致内存被移动)? - Ian Abbott
@IanAbbott 在一个注重安全的系统中,第一次mmap将始终提供零化内存。然后,一旦mlocked,该内存就是您的,直到您munmap它(此时您最好确保首先将其清零)。 - Petr Skocik
@PSkocik 好的,谢谢。所以 MREMAP_MAYMOVE 实际上不会复制,它只是将当前映射的物理内存页面重新映射到具有更多空间的虚拟地址空间的区域。我现在明白了。 - Ian Abbott
显示剩余2条评论
1个回答

8
在Linux系统中,使用mmap将内存块映射到进程地址空间,mlock锁住它,然后使用mremap代替realloc函数。为了防止存在隐藏副本,您还需要确保在清零之前,内存永远不会被交换到磁盘中。

我们很高兴拥有几乎无限的虚拟内存,不是吗? - Ajay Brahmakshatriya
另外,为了防止交换,可以将页面固定(在整个过程中),但前提是您信任操作系统。 - Ajay Brahmakshatriya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接