GNU C:如果我覆盖malloc()free()而不是realloc(),会发生什么?
我正在使用ARM交叉工具链ARM none ebi gcc为嵌入式系统编码。因为代码运行的是freeRTOS,它有自己的堆内存管理,所以我想覆盖libc中的malloc()、free()和realloc(),并简单地包装它们以调用freeRTOS中的函数。只有一个问题,freeRTOS没有realloc(),这很奇怪,但我的代码肯定需要它。所以我想了解,如果我只覆盖malloc()和free(),但仍然保持realloc()在libc中的版本不变,会发生什么?另外,我觉得提供我自己的realloc()来调用malloc()并在分配新内存块后执行memcopy,这在我看来不够安全,因为在我的应用程序中,新的大小通常大于旧的大小,所以当我执行memcopy()时如果内存块的大小大于实际分配的内存块,则可能会产生指针访问错误,这是可能的吗 提前谢谢。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
-woody部分替换分配器(替换某些函数但不替换其他函数)无法工作。最坏的情况是,一个实现将另一个实现的数据结构解释为自己的数据结构,从而导致严重的堆数据结构损坏。如果这样做的话,就有可能对此进行强化,从而在运行时无法链接或分配(提供空指针结果),我在musl libc中这样做,如以下提交中所述:
如果您确实需要
realloc
,那么您必须为正在采用的实现制作一个有效的。最简单的方法是只使用malloc
、memcpy
和free
,但实际上您需要一种方法来确定传递给memcpy
的长度参数。如果你只是通过了新的长度,那么在没有MMU的微控制器上可能是安全的,只要你的长度不太大,它们就有可能会进入MMIO范围或其他什么。但正确的做法是充分阅读malloc
实现,以了解其存储在何处分配的大小,然后编写自己的代码来提取该大小。此时,您可以使用memcpy
编写正确/有效的realloc
,这非常有用。现在,在我知道freeRTOS的malloc在哪里存储了先前分配的块的长度信息之后,我可以决定必须编写一个新的realloc
。非常感谢你!