Если replaceBytesInRange:bytesRange
вызывает сбой, то мое первое предложение о том, как избежать сбоя, - добавить проверку ошибок для предыдущих вызовов функций, от которых это зависит.
Например, в тех случаях, когда происходит сбой, возможно, bytesRange
не является допустимым / полезным значением. Может быть, это dataOut
, что недопустимо / пригодно для использования. Ваш код в вашем вопросе устанавливает эти значения из вызовов функций, но не проверяет возвращаемое значение для условий ошибок / индикаторов ошибок / недопустимых значений.
Это может быть связанный вызов зависимой функции. например, cryptStatus
устанавливается с помощью вызова CCCryptorUpdate()
, который имеет dataOut
в качестве входного параметра. Я не знаю Objective-C, и я не знаком с функцией CCCryptorUpdate()
, но похоже, что это повлияет на / заполнит dataOut
. Если он на самом деле возвращает ошибку, то, вероятно, dataOut
, вероятно, не будет в пригодном для использования состоянии к тому времени, когда вы используете его в строке replaceBytesInRange
. Проверка возвращаемого значения cryptStatus
может помечать условия, когда вы должны не продолжать использовать dataOut
в последующих вызовах.
Что подводит меня к другому, что я заметил: вы делаете проверяете пару вещей, но только регистрируете их. Проверки для if (dataOutMoved != dataOutLength)
и для (cryptStatus != kCCSuccess)
выглядят как вещи, которые должны остановить выполнение, или выйти из цикла, или что-то в этом роде, а не просто регистрировать вхождение.
Еще одна вещь, которую я вижу, это то, что dataOut
- это malloc()
один раз, не очищается и используется повторно. Это может быть вполне допустимо в некоторых обстоятельствах, но также может вызвать именно ту ошибку, которую вы видите. Что-нибудь в вашем коде предполагает что-либо о содержимом dataOut
? Я размышляю в духе строковых операций C, которые предполагают нулевое завершение. Если не соблюдать осторожность, нулевые терминаторы, которые, как предполагается, находятся там (или, возможно, на самом деле находятся там сначала), могут быть перезаписаны, если, скажем, весь буфер заполнен. Опять же, я не очень хорошо знаю Objective-C и эти функции, так что это не конкретное утверждение, а скорее аналогия вида вещей, которые могут происходить.
TL; DR : добавьте проверку ошибок для каждого из ваших вызовов функций и отвечайте соответствующим образом (прерывание, выход, повтор, все что угодно), чтобы последующий вызов функции не пытался использовать значения, которые указывают на ошибки или являются недопустимыми.
Держу пари, что с добавленной проверкой ошибок вы (1) остановите сбои и (2) узнаете что-то конкретное о , почему это то, что файлы, превышающие определенное количество, вызывают эти сбои.