Для начала позвольте мне сказать, что я понимаю, как и почему может возникнуть проблема, которую я описываю. Я был специалистом в области компьютерных наук, и я понимаю арифметику переполнения / недополнения и подписанную / неподписанную. (Для тех, кто не знаком с этой темой, в Руководстве по безопасному кодированию Apple кратко обсуждается переполнение целых чисел .)
Мой вопрос касается сообщения об этой ошибке и ее исправления после ее обнаружения, а более конкретно - в случае с Objective-C. (Я пишу и поддерживаю CHDataStructures .) У меня есть несколько классов коллекций, которые выделяют память для хранения объектов и динамически расширяются по мере необходимости. Я еще не видел сбоев, связанных с переполнением, вероятно потому, что в моих тестовых примерах в основном используются вменяемые данные. Однако, учитывая непроверенные значения, вещи могут взорваться довольно быстро, и я хочу предотвратить это.
Я определил как минимум два распространенных случая, когда это может произойти:
- Вызывающая сторона передает очень большое значение без знака (или отрицательное значение со знаком) в
-initWithCapacity:
.
- Было добавлено достаточно объектов для динамического расширения емкости, и емкость стала достаточно большой, чтобы вызвать переполнение.
Самое простое - определить, не произойдет ли переполнение. (Например, прежде чем пытаться выделить length * sizeof(void*)
байт, я могу проверить, равен ли length <= UINT_MAX / sizeof(void*)
, поскольку неудача в этом тесте будет означать, что продукт переполнится и потенциально выделит гораздо меньшую область памяти, чем необходимо. На платформах, которые его поддерживают, checkint.h API является еще одной альтернативой.) Сложнее всего определить, как с этим справиться. В первом сценарии вызывающий абонент, возможно, лучше подготовлен (или, по крайней мере, настроен), чтобы справиться с ошибкой. Второй сценарий может происходить в любом месте кода, в который объект добавляется в коллекцию, что может быть совершенно недетерминированным.
Итак, мой вопрос заключается в следующем: Как ожидается, что код Objective-C "добропорядочного гражданина" будет действовать, когда в этом типе ситуации происходит целочисленное переполнение? (В идеале, так как мой проект является структурой в Тот же дух, что и у Foundation в Какао, я бы хотел смоделировать так, как он ведет себя, для максимального «согласования импедансов». В найденной мной документации Apple об этом ничего особо не говорится.) Я полагаю, что в любом случай, сообщающий об ошибке, является данным. Поскольку API для добавления объекта (который может вызвать сценарий 2) не принимает параметр ошибки, что я могу сделать, чтобы помочь решить проблему, если что-нибудь? Что действительно считается нормальным в таких ситуациях? Я не хочу сознательно писать подверженный сбоям код, если смогу сделать лучше ...