2009-05-19 12 views
2

に、私はこのコード行がない(分割はインスタンス変数です):デバイスでエラーが発生しましたが、シミュレータ

splits = [[NSMutableArray alloc] initWithObjects:[NSMutableArray array]]; 

このコードは明らかに間違っている(それがnilで終了しなければならない)、しかし、それは中に微細な動作しますたとえそれがデバイス上にEXC_BAD_ACCESSをスローしたとしても、シミュレータを使用します。私の質問は、なぜシミュレータがエラーをスローしないのですか?

カイル

答えて

4

実際の結果はメモリの内容によって異なります。シミュレータのメモリレイアウトには、最初のパラメータ(無名配列)のアドレスの直後にゼロが含まれている可能性があります。このゼロは、あなたがnilで引数リストを閉じるように解釈され、すべて正常に動作します。 (PS)このような場合にはNS_REQUIRES_NIL_TERMINATIONという興味深いマクロがありますが、ここではあまり役に立ちませんが、明らかにここで助けにはなりません)。

0

バッファオーバーフローは未定義の動作につながります。アクセス違反(または顕著なバグ)が発生することは保証されていません。現代のマシンでは、 "他人の"メモリに足を踏み入そうとするとアクセス違反が発生しますが、自分のスタックから迷惑メールを読んでいるのではないでしょう。

MudflapValgrindのようなツールを試すことができます(これらの2つはC/C++のほうが意味がありますが、Obj- C)。

+0

これは正確にバッファオーバーフローではないと思います - 引数を取るva_argマクロは、何でも – zoul

+0

私はそれでもバッファオーバーフローと考えています。それは単に/ read /がバッファの終わりをオーバーフローさせたものであり、/ write /ではありません。あなたが技術的になりたいのであれば、それはCWE-126、バッファオーバーリード(cwe.mitre.org/data/definitions/126.html)またはCWE-125、アウトオブバウンドリード(http://cwe.mitre .org/data/definitions/125.html)。 –

1

iPhoneのメモリ容量は、お使いのコンピュータの容量よりはるかに少ないです。スタックのメモリ内の領域は、initWithObjects関数で使用される前に0x00(nil)に設定されている可能性があります。パラメータがinitWithObjects関数に送信され、スタックがアライメントされると、同じメモリ空間があまり使われないため、コンピュータのメモリ空間がiPhoneよりも0x00にプリセットされる可能性が高くなります。だから、すでにゼロに設定されているメモリ内のある場所からnilが読み込まれている可能性があります。

コンピュータでメモリをいっぱいにしてシミュレータを実行すると、シミュレータがiPhoneのようにクラッシュする可能性があります。

+0

プロセスがO/Sからメモリを要求し、O/Sがメモリをクリーンアップしないと、シミュレータなどのプロセスにメモリを渡す前に、使用済みのメモリがクリーンアップされます。そのプロセスはセキュリティ/プライバシーのリスクになります。 – ChrisW

関連する問題