На iOS 0x0000000000000026, 0x000000000000001c, 0x000000000000005a являются примерами теговых указателей? - PullRequest
0 голосов
/ 11 сентября 2018

В iOS 11, когда я намеренно создаю объекты, которые оказались бы теговыми указателями, они начинаются с 0xB вместо значений 0x0000000000000026, 0x000000000000001c, 0x000000000000005a, которые отображаются в моих отчетах о сбоях как недействительные адреса.Я думаю, что это, вероятно, помеченные указатели, но они не отформатированы как помеченные указатели, которые я вижу в отладчике.

Как насчет 0x0000000000000010, 0x0000000000000020, 0x0000000000000030?У всех них есть конечный 0, но они выглядят подозрительно маленькими, чтобы быть настоящими указателями.

1 Ответ

0 голосов
/ 11 сентября 2018

Детали реализации теговых указателей меняются от выпуска к выпуску и от архитектуры к архитектуре.С учетом вышесказанного они на самом деле не похожи на теговые указатели.

Наиболее вероятно, что некоторый фрагмент кода разыменовывается в структуру или объект, который неожиданно имеет значение NULL или nil.

Запустите этот код:

struct bob {
    void *a;
    void *b;
    void *c;
    char d[42];
};

int main(int argc, const char * argv[]) {
    struct bob *fred = NULL;

    fred->d[2] = 'q';
    return 0;
}

Вы получите этот сбой (на x86_64): Thread 1: EXC_BAD_ACCESS (code=1, address=0x1a)

То есть он пытается разыменовать через 0x0.Поэтому, скорее всего, у вас есть ссылка на структуру / объект, равная NULL, и ваш код пытается разыменовать переменную элемента или экземпляра, которая смещена на шестнадцатеричные числа, перечисленные вами с самого начала.

...