我正在创建一个Objective-C库,通过USB与一些外部设备通信。 当调用某个方法时,它会在方法内部的某个随机位置或某些C系统函数(与malloc或pthread相关)中崩溃,并出现以下错误之一“释放对象的无效校验和”,“autorelease pool page 0x1102032 corrupted”,甚至是未知的选择器错误(而选择器确实存在)。
使用Guard Malloc功能,它会在此行停止并出现EXEC_BAD_ACCESS错误:
- (void)theMethod {
// some code
NSMutableData *payloads_pool = [NSMutableData dataWithLength:0x800];
NSUInteger payloads_pool_length = [payloads_pool length];
void *buffer = [payloads_pool mutableBytes];
memset(buffer, 0xCC, payloads_pool_length);
for (i = 0; i < 0x800; i += 0x40) {
unsigned int *buf = [payloads_pool mutableBytes];
(buf+i)[0] = 0x405; <==== STOP ON THIS LINE
(buf+i)[1] = 0x101;
(buf+i)[2] = 0x8402B001;
(buf+i)[3] = 0x8402EB01;
}
// some code
}
答案 0 :(得分:3)
由于buf
是unsigned int*
,+
中的指针buf+i
不是添加无符号整数而不是字节,因此在内存中寻找太远了吗?
答案 1 :(得分:2)
然后我猜测payloads_pool
的字节数少于0x800
。
崩溃时i
的价值是多少?
为什么你的for循环从0变为payloads_pool.length
?