Ho trovato un insolito crasher con NSCoder quando si utilizza Apple LLVM Compiler 3.0 e compilato con -O3. Si blocca solo sui dispositivi. Ho testato un iPhone 4 con iOS 5, un iPad 2 con iOS 5 e un iPad 1 con iOS 4. Tutto si blocca in modo identico. Ecco la relativa sezione di codice:Arresto anomalo del dispositivo iOS durante il dereferenziamento di un puntatore restituito dalla decodifica di NSCoderBytesForKey
-(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;
}
Ed ecco quello che un BBPointI32 è:
typedef struct
{
NSInteger x;
NSInteger y;
}
BBPointI32;
Il EXC_BAD_ACCESS
accade quando data
è dereferenziato. Questo è non un problema di puntatore nullo. Se allego GDB, posso vedere che la lunghezza è 8, sizeof (BBPointI) è anche 8 e i dati sono corretti.
Se guardo lo smontaggio, l'incidente sta accadendo su:
ldrd r2, r3, [r0]
Il che sembra a posto. r0 contiene 0xb546e, che è l'indirizzo di data
. Quando ispeziono quella memoria, posso vedere che contiene i dati che mi aspetto. Per chiunque sia interessato, r2 contiene 72 (non sono sicuro di quello che è) e r3 contiene 8 (molto probabilmente il valore di length
).
Qualcuno può far luce su questo problema?
Grazie, è perfetto. Il problema * era * relativo alla decisione del compilatore di usare 'ldrd'. Quando lancio 'data' su un' BBPointI32 * 'presuppone che questo significhi che il puntatore era allineato correttamente, ma non lo era. Quindi, al posto di: m_value = * (BBPointI32 *) dati; Ho dovuto usare: memcpy (& m_value, data, length); –
@biorhythmist .. non solo un esilarante twitterer :) – ohhorob
Sto vivendo qualcosa di molto simile. Succede su iPad 3 e _non_ su iPad 2! –