Apple LLVM Compiler 3.0を使用し、-O3でコンパイルしたときにNSCoderで異常なクラッシャーが見つかりました。デバイス上でのみクラッシュします。 iOS 5を実行しているiPhone 4、iOS 5を実行しているiPad 2、iOS 4を実行しているiPad 1をテストしました。すべて同じようにクラッシュします。ここでは、コードの該当部分があります:NSCoderのdecodeBytesForKeyによって返されたポインタを参照解除するときにiOSデバイスでクラッシュする
typedef struct
{
NSInteger x;
NSInteger y;
}
BBPointI32;
data
がデリファレンスされたときにEXC_BAD_ACCESS
が起こる:
-(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があるものです。これはではなく、 nullポインタの問題です。 GDBを添付すると、長さが8、sizeof(BBPointI)も8、データが正しいことがわかります。
私は解体を見れば
、クラッシュが起こっている上:正常に見えるldrd r2, r3, [r0]
を。 r0は0xb546eを含み、これはdata
のアドレスです。そのメモリを調べると、期待したデータが格納されていることがわかります。興味のある人は、r2には72(それが何であるかわからない)とr3には8(おそらくはlength
の値)が含まれています。
誰もがこの問題にいくつかの光を当てることができますか?
ありがとうございました。この問題はコンパイラの 'ldrd'使用の決定に関連していました。 私は 'BBPointI32 *'に 'data'をキャストすると、ポインタが正しく整列していることを意味していると仮定しましたが、そうではありませんでした。したがって、代わりに: m_value = *(BBPointI32 *)data; 使用する必要があります: memcpy(&m_value、data、length); –
@biorhythmist ..ちょうど陽気なtwittererではありません:) – ohhorob
私は非常に似た何かを経験しています。 iPad 3で起こり、iPad 2では_not_! –