目标-C 变量布局
objective-C variable layout
我正在尝试调查我收到的恐慌消息,该消息是通过访问代码中的函数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
指令。它不会插入类似UTF8String
或strlen
.
objc_retainAutorelease是retain
+autorelease
的组合。 自动释放操作不是释放值,它将对象放入当前的"自动释放池"中(就像标记对象以供将来删除(。
在此代码中,我假设orgName
将NSString返回到rax
,然后它通过使用UTF8String
将NSString
转换为C字符串并放入r14
。出于某种原因,这段代码的作者决定(奇怪的是(不使用orgName.length
,而是使用strlen
。因此,将这个字符串orgName
的长度放入r15
中。
如果orgName.length
(在r15
中(小于 0x17,它将 C 字符串复制到var_8F
。 否则,它会分配一个新的缓冲区r12
并将orgName
C 字符串复制到该字符串。
*(int8_t *)(r12 - 0x1) = r15 + r15;
行很奇怪。这就像var_8F在var_8F之前有一个字节大小的字段,它在那里放置了字符串长度的两倍(长度很小,所以适合,但为什么要加倍?
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 尝试通过多个向量访问变量时,向量下标超出范围
- 试图让变量检查数组中的某些内容
- Cpp-Tuple使用带有变量的get
- 将包含C样式数组的对象初始化为成员变量(C++)
- 当vector是tje全局变量时,c++中vector的内存管理
- 目标-C 变量布局
- C++非虚拟类成员变量内存布局?
- 全局变量的内存布局
- c程序的内存布局,关于局部变量和全局变量的位置