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

GNU C:如果我覆盖malloc()free()而不是realloc(),会发生什么?,c,malloc,freertos,C,Malloc,Freertos,我正在使用ARM交叉工具链ARM none ebi gcc为嵌入式系统编码。因为代码运行的是freeRTOS,它有自己的堆内存管理,所以我想覆盖libc中的malloc()、free()和realloc(),并简单地包装它们以调用freeRTOS中的函数。只有一个问题,freeRTOS没有realloc(),这很奇怪,但我的代码肯定需要它。所以我想了解,如果我只覆盖malloc()和free(),但仍然保持realloc()在libc中的版本不变,会发生什么?另外,我觉得提供我自己的reallo

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

提前谢谢。
-woody

部分替换分配器(替换某些函数但不替换其他函数)无法工作。最坏的情况是,一个实现将另一个实现的数据结构解释为自己的数据结构,从而导致严重的堆数据结构损坏。如果这样做的话,就有可能对此进行强化,从而在运行时无法链接或分配(提供空指针结果),我在musl libc中这样做,如以下提交中所述:

但我怀疑许多其他实现也采取了同样的预防措施。他们不会帮助你真正想要的工作;他们只是为了防止灾难性的后果


如果您确实需要
realloc
,那么您必须为正在采用的实现制作一个有效的。最简单的方法是只使用
malloc
memcpy
free
,但实际上您需要一种方法来确定传递给
memcpy
的长度参数。如果你只是通过了新的长度,那么在没有MMU的微控制器上可能是安全的,只要你的长度不太大,它们就有可能会进入MMIO范围或其他什么。但正确的做法是充分阅读
malloc
实现,以了解其存储在何处分配的大小,然后编写自己的代码来提取该大小。此时,您可以使用
memcpy
编写正确/有效的
realloc
,这非常有用。现在,在我知道freeRTOS的malloc在哪里存储了先前分配的块的长度信息之后,我可以决定必须编写一个新的
realloc
。非常感谢你!