GNU C:如果我覆盖 malloc() free() 而不是 realloc() 会发生什么?
GNU C: What will happen if i overwrite malloc() free() but not realloc()?
我正在使用 ARM 交叉工具链 arm-none-ebi-gcc 为嵌入式系统编码。因为代码是 运行 freeRTOS,它有自己的堆内存管理,所以我想覆盖 libc 中的 malloc()、free() 和 realloc() 并将它们简单地包装起来以调用 freeRTOS 中的函数。只有一个问题,freeRTOS 没有 realloc(),这很奇怪,但我的代码绝对需要它。所以我想了解,如果我只覆盖 malloc() 和 free() 但仍然保留 realloc() 的版本,因为它在 libc 中,会发生什么情况?另外,我觉得提供我自己的 realloc() ,它只是用新的大小调用 malloc() 并在分配新的内存块后执行 memcopy 在我看来不够安全,因为新的大小通常大于旧的大小我的应用程序,所以当我执行一个大小大于实际分配的内存块的 memcopy() 时,可能会产生一些指针访问错误,这可能吗?
提前致谢。
-伍迪
部分替换分配器(替换一些函数但不替换其他函数)不起作用。在最坏的情况下,您会因为一个实现将另一个的数据结构解释为自己的数据结构而导致严重的堆数据结构损坏。有可能对此进行强化,以便在运行时无法 link 或无法分配(提供空指针结果),如果这样做的话,我在这些提交中描述的 musl libc 中做到了这一点:
- https://git.musl-libc.org/cgit/musl/commit/src/malloc?id=c9f415d7ea2dace5bf77f6518b6afc36bb7a5732
- https://git.musl-libc.org/cgit/musl/commit/src/malloc?id=618b18c78e33acfe54a4434e91aa57b8e171df89
- https://git.musl-libc.org/cgit/musl/commit/src/malloc?id=b4b1e10364c8737a632be61582e05a8d3acf5690
但我怀疑许多其他实施是否采取了相同的预防措施。而且它们不会帮助您实际工作;他们只是防止灾难性的结果。
如果您真的需要 realloc
,您将不得不为您正在采用的实施制作一个工作的。最简单的方法是只使用 malloc
、memcpy
和 free
,但实际上您需要一种方法来确定要传递给 memcpy
的长度参数。如果您只是通过新长度,它 可能 在没有 MMU 的微控制器上是安全的,只要您的长度不是太大,它们就有 运行 进入 MMIO 范围的风险或者其他的东西。但正确的做法是充分阅读 malloc
实现以了解它存储分配大小的位置,然后编写自己的代码来提取它。那时你可以写一个 correct/valid realloc
使用 memcpy
.
我正在使用 ARM 交叉工具链 arm-none-ebi-gcc 为嵌入式系统编码。因为代码是 运行 freeRTOS,它有自己的堆内存管理,所以我想覆盖 libc 中的 malloc()、free() 和 realloc() 并将它们简单地包装起来以调用 freeRTOS 中的函数。只有一个问题,freeRTOS 没有 realloc(),这很奇怪,但我的代码绝对需要它。所以我想了解,如果我只覆盖 malloc() 和 free() 但仍然保留 realloc() 的版本,因为它在 libc 中,会发生什么情况?另外,我觉得提供我自己的 realloc() ,它只是用新的大小调用 malloc() 并在分配新的内存块后执行 memcopy 在我看来不够安全,因为新的大小通常大于旧的大小我的应用程序,所以当我执行一个大小大于实际分配的内存块的 memcopy() 时,可能会产生一些指针访问错误,这可能吗?
提前致谢。 -伍迪
部分替换分配器(替换一些函数但不替换其他函数)不起作用。在最坏的情况下,您会因为一个实现将另一个的数据结构解释为自己的数据结构而导致严重的堆数据结构损坏。有可能对此进行强化,以便在运行时无法 link 或无法分配(提供空指针结果),如果这样做的话,我在这些提交中描述的 musl libc 中做到了这一点:
- https://git.musl-libc.org/cgit/musl/commit/src/malloc?id=c9f415d7ea2dace5bf77f6518b6afc36bb7a5732
- https://git.musl-libc.org/cgit/musl/commit/src/malloc?id=618b18c78e33acfe54a4434e91aa57b8e171df89
- https://git.musl-libc.org/cgit/musl/commit/src/malloc?id=b4b1e10364c8737a632be61582e05a8d3acf5690
但我怀疑许多其他实施是否采取了相同的预防措施。而且它们不会帮助您实际工作;他们只是防止灾难性的结果。
如果您真的需要 realloc
,您将不得不为您正在采用的实施制作一个工作的。最简单的方法是只使用 malloc
、memcpy
和 free
,但实际上您需要一种方法来确定要传递给 memcpy
的长度参数。如果您只是通过新长度,它 可能 在没有 MMU 的微控制器上是安全的,只要您的长度不是太大,它们就有 运行 进入 MMIO 范围的风险或者其他的东西。但正确的做法是充分阅读 malloc
实现以了解它存储分配大小的位置,然后编写自己的代码来提取它。那时你可以写一个 correct/valid realloc
使用 memcpy
.