iOS 中的 malloc 校验和逻辑是什么?

What's the malloc checksum logic in iOS?

校验和的原因是什么。如何以及何时检查(例如 before/after 分配,before/after 解除分配)?

我为什么感兴趣?继续阅读。

在将大型项目移植到 arm64 时,我 运行 遇到了一些难以诊断的崩溃,这些崩溃必须与非常流行的 malloc 校验和失败有关。我在有问题的地址上设置了观察点,它与基地址的偏移量始终相同。该地址是 CPP class 的成员变量(并且它只是一个 32 位整数)。该项目有一些 C 和 CPP 与 ObjC 混合在一起,这让我倾向于对齐错误。

观察点很少命中,只有在对象开始使用时才会命中,然后它们就不管了,但它仍然会在同一地址崩溃。

我知道它的目的是识别写入无效地址,但了解 how/when 它的执行可能有助于揭示这个错误。

malloc 函数中的校验和通常针对为块(不是数据区域)保存的 control 信息执行,例如地址前的十六个字节你得到了,它包含块大小、下一个块、校验和等信息。

设置它的最合乎逻辑的时间是在块分配(或重新分配,如果就地完成)时,否则信息往往不会改变。

通常也会在释放时检查,以发现错误写入已损坏控制信息的情况。

我建议,如果您正在写入与分配的内存(您的 "member varaible of a CPP class")的 偏移量并且这导致了问题,那么您没有'为它分配足够的内存。换句话说,您正在覆盖 next 块的控制信息(空闲或已分配,可能对检查代码无关紧要)。

请记住,这是基于记忆领域如何工作的一般知识,而不是 iOS 的特定 细节。但在我所见的一切中,有相当多的共性。在 malloc/realloc 上设置校验和并在 free 上检查它是有意义的,因为在任何其他时间都不必费心检查它。

而且,根据您所说的操作损坏,很可能是缓冲区溢出而不是欠载。