校验和的原因是什么?如何以及何时检查(例如在分配之前/之后,在重新分配之前/之后)?
为什么我感兴趣?请继续阅读。
在将一个大型项目移植到arm64时,我遇到了一些难以诊断的崩溃问题,而这种崩溃不得不与那些流行的malloc校验和失败相提并论。我在违规地址上设置了观察点,它始终与基地址相同。该地址是CPP类的成员变量(它只是一个32位整数)。该项目将一些C和CPP与ObjC混合在一起,这使我倾向于对齐错误。
观察点很少被击中,只有在使用对象的开始时,它们才会被单独留下,但它仍然会在同一地址崩溃。
我理解它的目的是识别写入无效地址,但知道如何/何时执行它可以帮助阐明这个错误。
答案 0 :(得分:3)
malloc
函数中的校验和通常是针对块(而不是数据区)保存的控制信息执行的,例如紧接在您给出的地址之前的16个字节,它包含块大小,下一个块,校验和等信息。
设置它的最合理时间是在块分配(或重新分配,如果它就地完成),因为信息往往不会改变。
在解除分配时通常也会检查,以捕获错误写入损坏控制信息的情况。
我建议,如果你从分配的内存中写入肯定的偏移量(你的“CPP类的成员”)并导致问题,那么你还没有为它分配了足够的内存。换句话说,您正在编写 next 块的控制信息(免费或已分配,可能与检查代码无关)。
请记住,这是基于内存竞技场如何工作的一般知识,而不是iOS的特定细节。但是我所看到的所有共同点都有相当多的共性。在malloc/realloc
上设置校验和并在free
上进行检查是有意义的,因为它在任何其他时间都没有麻烦地检查它。
而且,根据你所说的操作是腐败,它可能是缓冲区溢出而不是欠载。