4

クラッシュを誘発するために次のコードを書きました (CrashReporter でいくつかの問題をテストしていました)。

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

真新しいプロジェクト(アプリのデリゲートに入れましたapplicationDidFinishLaunching:)では、予想どおりにクラッシュします。しかし、既存のプロジェクトの 1 つに追加すると、クラッシュしません! 実際、「Hello world 0」をシステム ログに出力することになります。

これは私には意味がありません。null 逆参照がクラッシュを引き起こさないのはなぜですか?

4

3 に答える 3

8

NULL のデリファレンスには未定義の動作があり、クラッシュを引き起こす必要はありません。

そうは言っても、2 つのプロジェクトで異なるコンパイラ オプションを使用すると、それらのケースで異なる動作が得られる可能性が高くなります。未定義の動作に関するこのLLVM ブログ投稿を参照してください。

于 2012-04-30T00:23:06.087 に答える
2

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

コンパイラが異なれば、結果も異なります。また、コンパイラ オプション (リリース構成とデバッグ構成など) も影響します。

クラッシュを強制しようとしている場合は、いつでも null ポインターへの書き込みを開始できます...

于 2012-04-30T00:33:01.353 に答える