GNU C:如果我覆盖malloc()free()但不覆盖realloc()会发生什么?

问题描述 投票:0回答:1

我正在使用ARM交叉工具链arm-none-ebi-gcc为嵌入式系统编码。因为代码正在运行具有自己的堆内存管理功能的freeRTOS,所以我想覆盖libc中的malloc(),free()和realloc()并将它们包装起来,以便在freeRTOS中调用函数。只是一个问题,freeRTOS没有realloc(),这很奇怪,但是我的代码肯定需要它。因此,我想了解一下,如果我只覆盖malloc()和free()但仍然保持realloc()的版本与libc中的版本相同,将会发生什么?另外,我觉得提供自己的realloc()只是用新的大小调用malloc(),并在分配了新的内存块后进行内存复制,这在我看来还不够安全,因为新的大小通常大于旧大小。我的应用程序,所以当我执行一个大于实际分配的内存块的memcopy()时,可能会产生一些指针访问错误,这可能吗?

谢谢。-woody

c malloc freertos
1个回答
0
投票

部分替换分配器(替换某些功能,但不替换其他功能)无法正常工作。最糟糕的是,一个实现将另一个人的数据结构解释为自己的数据结构时,会导致严重的堆数据结构损坏。可以对此进行加固,以使事情在执行时无法链接或无法在运行时分配(提供空指针结果),而我在musl libc中做到了,如这些提交中所述:

但是我怀疑其他许多实现方式也采取了同样的预防措施。他们不会帮助您实际想要的工作。他们只是防止灾难性的结果。

如果您确实需要realloc,则必须为要采用的实现创建一个可行的版本。最简单的方法是将其设置为mallocmemcpyfree,但实际上,您需要一种方法来确定要传递给memcpy的length参数。如果您只是传递新的长度,那么在没有MMU的微控制器上,只要您的长度不是很大,就可能会超出MMIO范围或其他范围,因此可能是安全的。但是正确的做法是阅读malloc实现,足以了解它存储分配的大小的位置,并编写自己的代码来提取该大小。此时,您可以使用realloc编写正确/有效的memcpy

© www.soinside.com 2019 - 2024. All rights reserved.