द्वारा दिया अपसंदर्भन जब एप्पल LLVM संकलक 3.0 का उपयोग कर रहा NSCoder साथ एक असामान्य आनेवाला पाया और -O3 साथ संकलित किया है। यह केवल उपकरणों पर दुर्घटनाग्रस्त है। मैंने आईओएस 4 चलाने वाले आईफोन 4 का परीक्षण किया है, एक आईपैड 2 आईओएस 5 चला रहा है और एक आईपैड 1 आईओएस चला रहा है 4. सभी क्रैश समान रूप से। यहाँ कोड के प्रासंगिक अनुभाग है:iOS पर क्रैश डिवाइस जब एक सूचक NSCoder के decodeBytesForKey
-(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;
}
और यहाँ क्या एक BBPointI32 है:
typedef struct
{
NSInteger x;
NSInteger y;
}
BBPointI32;
EXC_BAD_ACCESS
होता है जब data
dereferenced है। यह एक शून्य सूचक समस्या है। अगर मैं जीडीबी संलग्न करता हूं, तो मैं देख सकता हूं कि लंबाई 8 है, आकार (बीबीपीओटीआईआई) भी 8 है और डेटा सही है।
ldrd r2, r3, [r0]
कौन सा ठीक लग रहा है:
अगर मैं disassembly को देखो, दुर्घटना पर हो रहा है। आर 0 में 0xb546e है, जो data
का पता है। जब मैं उस स्मृति का निरीक्षण करता हूं, तो मैं देख सकता हूं कि इसमें डेटा शामिल है। रुचि रखने वाले किसी भी व्यक्ति के लिए, आर 2 में 72 (सुनिश्चित नहीं है कि यह क्या है) और आर 3 में 8 (संभवतः length
का मान) है।
क्या कोई इस मुद्दे पर कुछ प्रकाश डाल सकता है?
धन्यवाद, यह जगह है। समस्या * 'ldrd' का उपयोग करने के संकलक के निर्णय से संबंधित थी। जब मैंने 'बीबीपीओटीआई 32 *' को 'डेटा' डाला तो यह माना जाता था कि इसका मतलब था कि सूचक सही ढंग से गठबंधन था, लेकिन ऐसा नहीं था। तो, इसके बजाय: m_value = * (BBPointI32 *) डेटा; मुझे उपयोग करने की आवश्यकता है: memcpy (& m_value, डेटा, लंबाई); –
@biorhythmist .. सिर्फ एक उल्लसित twitterrer नहीं :) – ohhorob
मैं कुछ बहुत समान अनुभव कर रहा हूँ। आईपैड 3 पर होता है, और _not_ आईपैड 2 पर होता है! –