Что такое логика контрольной суммы malloc в iOS?

В чем причина контрольной суммы. Как и когда это проверяется (например, до / после распределения, до / после освобождения)?

Почему я заинтересован? Читать дальше.

При переносе большого проекта на arm64 я сталкиваюсь с некоторыми трудностями в диагностике сбоев, связанных с этим очень популярным сбоем контрольной суммы malloc. Я установил контрольные точки на неправильном адресе, и это всегда то же самое смещение от базового адреса. Этот адрес является переменной-членом класса CPP (и это всего лишь 32-разрядное целое число). В проекте есть некоторые C и CPP, смешанные вместе с ObjC, что заставляет меня склоняться к ошибкам выравнивания.

Точки наблюдения редко попадают в цель, только в начале использования объекта, затем они остаются одни, но все же он падает по тому же адресу.

Я понимаю, что это предназначено для идентификации записи по неверному адресу, но знание того, как / когда это выполняется, может помочь пролить свет на эту ошибку.

1 ответ

Решение

Контрольные суммы в malloc Функции обычно выполняются для управляющей информации, хранящейся для блока (не для области данных), например, шестнадцать байтов, непосредственно предшествующих указанному вами адресу, который содержит такую ​​информацию, как размер блока, следующий блок, контрольная сумма и так далее.

И самое логичное время для его установки - при распределении блоков (или перераспределении, если оно сделано на месте), так как в противном случае информация не меняется.

Он также обычно проверяется во время освобождения, чтобы выявить ситуацию, когда ошибочная запись повредила управляющую информацию.

Я бы предположил, что если вы пишете с положительным смещением от выделенной памяти (ваш "член, доступный для класса CPP"), и это вызывает проблему, то вы не выделили для нее достаточно памяти. Другими словами, вы записываете управляющую информацию для следующего блока (свободную или выделенную, вероятно, не имеет значения для проверочного кода).

Имейте в виду, что это основано на общих знаниях о том, как работают области памяти, а не на конкретных деталях iOS. Но во всем, что я видел, есть много общего. Имеет смысл установить контрольную сумму на malloc/realloc и проверить это на free, так много смысла, чтобы не беспокоиться о проверке в любое другое время.

И, исходя из того, что операция, которую вы заявляете, разрушает, скорее всего, это переполнение буфера, а не опустошение.

Другие вопросы по тегам