我正在創建Objective-C庫以通過USB與某些外部設備進行通信。 當調用某個方法時,它會在方法內部的隨機位置或某些C系統函數(與malloc或pthread相關)中發生崩潰,並出現以下錯誤之一「釋放對象的校驗和無效」,「autorelease pool page 0x1102032 corrupted」 ,或者甚至是未知的選擇器錯誤(而選擇器確實存在)。啓用了ARC的模糊內存錯誤
使用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
}
'i'的值是0x280(640),現在它從0循環到'payloads_pool_length',但它不會改變任何東西。在調試器中檢查局部變量時,它顯示「payloads_pool」長度爲0x800' –
然後,您應該考慮@zoul的答案 - 您將循環到字節數,但將它們視爲「int」你需要循環到'length/sizeof(int)' – deanWombourne
值640似乎證實了我的答案,因爲如果你的目標的'unsigned int'的大小是4字節,640 * 4就是2048(0x800),而先前的迭代((640-64)* 4)很好。 – zoul