Есть ли у приведения адреса (id) побочные эффекты ???Адрес 0xbfffe8d0 особенный?(исправлено: проблема была с _NSCallStackArray) - PullRequest
3 голосов
/ 01 апреля 2012

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

id foo = (id)0xbfffe8d0;

Тем не менее, это не проблема:

int foo = (int)(id)0xbfffe8d0;

И даже этонет проблем:

int magicAddr = 0xbfffe8d0;
id foo = (id)magicAddr;

WTF?

Простая вставка этой строки кода в определенный метод init приводит к сбою моей итерации через массив с "NSGenericException: Collection был изменен во времяперечисляются ".Комментирование строки приводит к исключению исключения.Этот код является однопоточным.Поведение является детерминированным и постоянно воспроизводится снова и снова и постоянно не воспроизводится, когда я комментирую строку.«foo» - это выдуманная переменная, на которую больше не ссылаются.Никакой другой код не ссылается на «foo».

Есть ли у этой строки побочный эффект?Имеет ли приведение числа к (id) побочный эффект?

Подробнее о том, что я делал:

  • Я запустил NSLog (@ "self =% p, super=% p ", self, super) и распечатал" self = 0xa83dc50, super = 0xbfffe8d0 ", что заставило меня задать этот вопрос
  • У меня есть _NO_IDEA_, что это значение 0xbfffe8d0 илиозначает.
  • Вставленная мною строка находится внутри метода init2 для класса, имеющего ссылку на NSEnumerator в коллекции, которая выдает исключение.Класс НЕ изменяет коллекцию и даже не имеет ссылки на коллекцию.

Точный код: (удален, не актуален или интересен)


OKтак что я до сих пор не могу объяснить поведение выше.Я не могу объяснить, почему 4-байтовое int в стеке в порядке, но 4-байтовое «id» - это крах.Но я запускал этот код несколько сотен раз, помещая все помехи случайного дерьма, и я мог вызывать сбои с другими значениями и утверждениями.Всегда детерминированный, но нет четкого или объяснимого шаблона для вещей, которые рухнули против вещей, которые этого не сделали.Биззари, но не главная проблема.

Реальная проблема? Коллекция была от [NSThread callStackSymbols].Это возвращает _NSCallStackArray.Вот где живет настоящая Зебра.В этой псевдосборке есть что-то странное, но я не могу точно сказать, что именно.

Исправление?

[NSArray arrayWithArray: [NSThread callStackSymbols]]

С исправлением нет комбинациислучайное дерьмо в моем коде вызовет сбой перечисления.Так что будьте осторожны.Если вы планируете возвращать символы стека вызовов и рассматривать их как массив, СДЕЛАЙТЕ КОПИЮ.

Урок? Если вы вызываете [NSThread callStackSymbols] и хотите трактовать результат какмассив, сделать копию и получить реальный массив.Остальное .... "там будут драконы" !!

1 Ответ

3 голосов
/ 01 апреля 2012

Нет.id является typedef для типа указателя, и присвоение указателю не имеет побочных эффектов.У вас есть другая ошибка в вашем коде где-то еще, невозможно сказать, не увидев больше кода.

0xbfffe8d0 - указатель на адрес в вашем стеке.При компиляции без оптимизации присваивание записывает значение 0xbffe8d0 в ваш стек, но тогда это значение нигде не читается.Таким образом, он имеет эффект (а) увеличения размера кадра стека этой функции на 4 байта и (б) изменения размера кода функции и смещения всего последующего кода.Скорее всего, эти изменения приводят к появлению или отсутствию ошибки в другом месте вашей программы.

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