Ошибка в устройстве, но не в симуляторе - PullRequest
2 голосов
/ 19 мая 2009

У меня есть эта строка кода (split это переменная экземпляра):

splits = [[NSMutableArray alloc] initWithObjects:[NSMutableArray array]];

Этот код явно неправильный (он должен заканчиваться нулем), однако он отлично работает в симуляторе, даже если на устройстве выдается EXC_BAD_ACCESS У меня вопрос, почему симулятор не выдает ошибку?

Кайл

Ответы [ 3 ]

4 голосов
/ 19 мая 2009

Фактический результат зависит от содержимого памяти. Вполне возможно, что расположение памяти на симуляторе содержит ноль сразу после адреса первого параметра (анонимного массива). Этот ноль интерпретируется как если бы вы закрыли список аргументов с помощью nil, и все работает нормально. (P.S. Для таких случаев есть интересный макрос NS_REQUIRES_NIL_TERMINATION, хотя он, очевидно, здесь не поможет.)

1 голос
/ 19 мая 2009

iPhone имеет гораздо меньше памяти, чем ваш компьютер. Область в стеке для стека могла бы быть установлена ​​на 0x00 (ноль) перед использованием функцией initWithObjects. Когда параметры отправляются в функцию initWithObjects и стек распределяется, это пространство памяти на компьютере с большей вероятностью будет установлено на 0x00, чем на iPhone, потому что это же пространство памяти используется реже. Таким образом, вполне вероятно, что ноль читается из области памяти, уже установленной в 0.

Если вы заполнили свою память на своем компьютере, а затем запустили симулятор, симулятор, скорее всего, потерпит крах, как iPhone.

0 голосов
/ 19 мая 2009

Переполнение буфера приводит к неопределенному поведению. Они не гарантируют нарушение доступа (или даже заметную ошибку). На современных машинах они вызовут нарушение прав доступа, если вам случится наступить на «чужую» память, но, вероятно, нет, если вы просто читаете мусор из своего собственного стека.

По сути, вам просто нужно быть осторожным, и вы можете попробовать такие инструменты, как Mudflap и Valgrind , чтобы помочь вам (эти два больше предназначены для C / C ++, и я не знаю, насколько хорошо они относятся к Obj-C).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...