目标-C 变量布局

objective-C variable layout

本文关键字:布局 变量 目标      更新时间:2023-10-16

我正在尝试调查我收到的恐慌消息,该消息是通过访问代码中的函数strlen中的地址 0 触发的,这基本上与 objective-C 变量相结合C++。

产生恐慌的方法不直接访问strlen而是从 ARC 引擎访问,我试图弄清楚strlen自动释放变量的一部分用于什么。

根据从 disassembler 复制的下一个块,似乎[rax UTF8String]输出生成 null 而不是有效字符串,这最终导致了崩溃。也许任何人都可以告诉我在autoreleasing变量后需要此检查的 objective-C 的内部布局是什么。

*(int8_t *)(r15 + rbx) = 0x0;
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::operator=(r13 + 0x198, &var_60);
rax = [var_98 orgName];
rax = [rax retain];
rax = objc_retainAutorelease(rax);
var_70 = rax;
r14 = [rax UTF8String];
var_90 = intrinsic_movaps(var_90, 0x0);
var_80 = 0x0;
r15 = strlen(r14);
if (r15 >= 0xfffffffffffffff0) goto loc_10001267b;
if (r15 < 0x17) {
r12 = &var_8F;
*(int8_t *)(r12 - 0x1) = r15 + r15;
if (r15 != 0x0) {
memcpy(r12, r14, r15);
}
}
else {
r12 = operator new(r15 + 0x10 & 0xfffffffffffffff0);
var_80 = r12;
var_90 = r15 + 0x10 & 0xfffffffffffffff0 | 0x1;
memcpy(r12, r14, r15);
}

ARC 只插入retain/release/autorelease指令。它不会插入类似UTF8Stringstrlen.

objc_retainAutorelease是retain+autorelease的组合。 自动释放操作不是释放值,它将对象放入当前的"自动释放池"中(就像标记对象以供将来删除(。

在此代码中,我假设orgName将NSString返回到rax,然后它通过使用UTF8StringNSString转换为C字符串并放入r14。出于某种原因,这段代码的作者决定(奇怪的是(不使用orgName.length,而是使用strlen。因此,将这个字符串orgName的长度放入r15中。

如果orgName.length(在r15中(小于 0x17,它将 C 字符串复制到var_8F。 否则,它会分配一个新的缓冲区r12并将orgNameC 字符串复制到该字符串。

*(int8_t *)(r12 - 0x1) = r15 + r15;行很奇怪。这就像var_8F在var_8F之前有一个字节大小的字段,它在那里放置了字符串长度的两倍(长度很小,所以适合,但为什么要加倍?