2012-04-30 16 views
4

私はクラッシュ(私はCrashReporterでいくつかissuesをテストしていた)を誘導するために、次のコードを書いた:ブランドの新しいプロジェクトでヌル参照解除でプログラムがクラッシュしないのはなぜですか?

int *nullp = NULL; 
int val = *nullp;  
NSLog(@"Hello world %d", val); 

(私はアプリデリゲートのapplicationDidFinishLaunching:に入れて)予想通り、それはクラッシュします。しかし、既存のプロジェクトの1つに追加すると、クラッシュしません!実際には、 "Hello world 0"をシステムログに出力してしまいます。

これは私には意味がありません。 null参照がクラッシュする原因は何ですか?

+2

その他のオプション:[キャストせずにCのクラッシュを作る](のhttp:/ /stackoverflow.com/questions/5556183/make-c-crash-without-casting) –

答えて

8

Dereferncing NULLには未定義の動作がありますが、クラッシュする必要はありません。

つまり、2つのプロジェクトで異なるコンパイラオプションを使用している場合、それらのケースで異なる動作を得る良い機会があります。未定義の動作についてはLLVM blog postを参照してください。

+0

ありがとう、私は分かりませんでした。 「LLVMベースのコンパイラを使用している場合は、揮発性のロードとストアが一般的であるため、あなたが探しているのであれば、「揮発性の」ヌルポインタを参照してクラッシュすることができますオプティマイザが触れていない」 – pepsi

+1

その投稿は私が最初にそれを読んだときに私の目を開けた(約1か2か月前) – MByD

+0

これはおそらく、Cに慣れていない人達に指摘する価値があることは、 'nullp'をvolatile int * = NULL; '。 –

2

ヌルポインタを逆参照することは未定義の動作です。つまり、と言うルールはありません。はアプリをクラッシュさせる必要があります。

コンパイラごとに異なる結果が得られます。異なるコンパイラオプション(リリース対デバッグ設定など)も影響を与えます。

あなたは常にNULLポインタへの書き込みを開始することができクラッシュを強制しようとしている場合...あなたがそれらを必要とする場合、クラッシュの原因となるため

+0

nullポインタへの書き込みはクラッシュを発生させる可能性が高くなりますが、それは保証されません。コンパイラとプロセッサのアーキテクチャに精通していない限り、未定義は予測不能で、少なくとも100%の保証を意味します。 –

関連する問題