Tôi đã tìm thấy một crasher bất thường với NSCoder khi sử dụng Apple LLVM Compiler 3.0 và được biên dịch với -O3. Nó chỉ treo trên các thiết bị. Tôi đã thử nghiệm iPhone 4 chạy iOS 5, iPad 2 chạy iOS 5 và iPad 1 chạy iOS 4. Tất cả sự cố đều giống nhau. Dưới đây là phần có liên quan của mã:Tai nạn trên thiết bị iOS khi dereferencing một con trỏ trở về bởi decodeBytesForKey của NSCoderer
-(id)initWithCoder:(NSCoder*)decoder
{
if (![super init])
{
return nil;
}
NSUInteger length = 0;
uint8_t* data = (uint8_t*)[decoder decodeBytesForKey:BBKey returnedLength:&length];
m_value = *(BBPointI32*)data;
return self;
}
Và đây là những gì một BBPointI32 là:
typedef struct
{
NSInteger x;
NSInteger y;
}
BBPointI32;
Các EXC_BAD_ACCESS
xảy ra khi data
được dereferenced. Đây là không phải vấn đề về con trỏ null. Nếu tôi đính kèm GDB, tôi có thể thấy rằng chiều dài là 8, sizeof (BBPointI) cũng là 8 và dữ liệu là chính xác.
Nếu tôi nhìn vào tháo gỡ, các vụ tai nạn xảy ra vào lúc:
ldrd r2, r3, [r0]
Mà có vẻ tốt đẹp. r0 chứa 0xb546e, là địa chỉ của data
. Khi tôi kiểm tra bộ nhớ đó, tôi có thể thấy rằng nó chứa dữ liệu tôi mong đợi. Đối với bất kỳ ai quan tâm, r2 chứa 72 (không chắc chắn đó là gì) và r3 chứa 8 (hầu hết có thể là giá trị của length
).
Có ai có thể làm sáng tỏ vấn đề này không?
Cảm ơn, đó là điểm trên. Vấn đề * là * liên quan đến quyết định của trình biên dịch để sử dụng 'ldrd'. Khi tôi truyền 'dữ liệu' sang' BBPointI32 * ', nó giả định rằng điều này có nghĩa là con trỏ đã được căn chỉnh đúng cách, nhưng không phải. Vì vậy, thay vì: m_value = * (BBPointI32 *) dữ liệu; Tôi cần sử dụng: memcpy (& m_value, dữ liệu, độ dài); –
@biorhythmist .. không chỉ là một twitterer vui nhộn :) – ohhorob
Tôi đang trải qua một cái gì đó rất giống nhau. Xảy ra trên iPad 3 và _not_ trên iPad 2! –