2012-09-10 19 views
2

我正在創建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 
} 

回答

3

由於bufunsigned int*,是不是指針+buf+i添加無符號整數而不是字節,因此在內存中尋找太多?

2

然後我猜的payloads_pool在少於0x800字節

什麼價值i當它崩潰?

爲什麼不是你的循環從0到payloads_pool.length

+0

'i'的值是0x280(640),現在它從0循環到'payloads_pool_length',但它不會改變任何東西。在調試器中檢查局部變量時,它顯示「payloads_pool」長度爲0x800' –

+0

然後,您應該考慮@zoul的答案 - 您將循環到字節數,但將它們視爲「int」你需要循環到'length/sizeof(int)' – deanWombourne

+0

值640似乎證實了我的答案,因爲如果你的目標的'unsigned int'的大小是4字節,640 * 4就是2048(0x800),而先前的迭代((640-64)* 4)很好。 – zoul