Я пытаюсь исследовать паническое сообщение, которое я получил, вызванное доступом к адресу 0 в функции strlen
в моем коде, который в основном является C ++ с объединенными с переменными target-C.
Метод, который вызывает панику, не обращается напрямую к strlen
, а из ARC-движка, и я пытаюсь выяснить, для чего используется strlen
как часть автоматического высвобождения переменной.
Согласно следующему блоку, скопированному из дизассемблера, похоже, что вывод [rax UTF8String]
выдал пустую строку вместо допустимой строки, и это в конечном итоге привело к падению.Возможно, кто-нибудь может сказать мне, каково внутреннее расположение объекта C, для которого требуется эта проверка после autoreleasing
переменной.
*(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);
}