在iOS 11上,当我有意创建的对象被标记为指针时,它们从0xB开始,而不是在崩溃报告中显示为无效地址的0x000000000000001c、0x0000000000005a值。我认为这些可能是带标记的指针,但它们的格式不像我在调试器中看到的带标记的指针那样。
0x00000000000000000010,0x0000000000000020,0x0000000000000030怎么样?它们都有一个尾随的0,但它们看起来确实小得让人怀疑是真正的指针。
发布于 2018-09-12 03:30:07
标记指针的实现细节因版本和架构的不同而不同。话虽如此,这些看起来真的不像带标签的指针。
最有可能的情况是,某段代码正在取消对意外为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取消引用。因此,更有可能的情况是,您的结构/对象引用为空,并且您的代码试图取消对元素或实例变量的引用,该元素或实例变量从开头开始被您列出的十六进制#所偏移。
https://stackoverflow.com/questions/52265470
复制相似问题