Objective c 启用ARC时隐藏内存错误
我正在创建一个Objective-C库,通过USB与一些外部设备进行通信。 调用某个方法时,它会在该方法或某些C系统函数(与malloc或pthread相关)内的任意位置崩溃,并出现以下错误之一“释放对象的校验和无效”、“自动释放池页面0x1102032已损坏”,甚至出现未知选择器错误(而选择器确实存在) 使用Guard Malloc功能,它在此行停止,并出现EXEC\u BAD\u访问错误:Objective c 启用ARC时隐藏内存错误,objective-c,memory-leaks,Objective C,Memory Leaks,我正在创建一个Objective-C库,通过USB与一些外部设备进行通信。 调用某个方法时,它会在该方法或某些C系统函数(与malloc或pthread相关)内的任意位置崩溃,并出现以下错误之一“释放对象的校验和无效”、“自动释放池页面0x1102032已损坏”,甚至出现未知选择器错误(而选择器确实存在) 使用Guard Malloc功能,它在此行停止,并出现EXEC\u BAD\u访问错误: - (void)theMethod { // some code NSMutableData *p
- (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
}
—(无效)方法{
//一些代码
NSMutableData*有效负载_池=[NSMutableData数据长度:0x800];
NSU整数有效负载_池长度=[有效负载_池长度];
void*buffer=[payloads\u pool mutableBytes];
memset(缓冲区,0xCC,有效负载\u池\u长度);
对于(i=0;i<0x800;i+=0x40){
unsigned int*buf=[payloads_pool mutableBytes];
(buf+i)[0]=0x405;那么我猜payloads\u pool
中的字节数少于0x800
当它崩溃时,i
的值是多少
为什么你的for循环没有从0到有效负载池。长度?既然buf
是unsigned int*
,那么buf+i
中的指针+
不是在添加无符号整数而不是字节,从而在内存中搜索得太远吗?i
的值不是0x280(640)现在它从0循环到payloads\u pool\u length
,但它不会改变任何东西。同时在调试器中检查局部变量,它显示payloads\u pool
在长度上是0x800
,然后你应该考虑@zoul的答案-你循环到字节数,但将它们视为int
s-你需要d循环到length/sizeof(int)
值640似乎证实了我的答案,因为如果目标的unsigned int
的大小为4字节,640*4超过2048(0x800),而上一次迭代((640-64)*4)很好。感谢这些解释!我希望可以,但我没有足够的声誉:(