CおよびC++では、nullポインターの逆参照は未定義の動作です。Objective-Cはどうですか?
言い換えれば、このコードは何をすることが保証されていますか?
*(long*)0 = 0;
背景:この回答が未定義の動作を引き起こし、ステートメントが最適化されるなどのランダムなものや、さらに奇妙なものを引き起こす可能性があるのではないかと思います。
もちろん、私はこれを行うことを推奨しません。それでも、言語のルールを知ることは重要です。
CおよびC++では、nullポインターの逆参照は未定義の動作です。Objective-Cはどうですか?
言い換えれば、このコードは何をすることが保証されていますか?
*(long*)0 = 0;
背景:この回答が未定義の動作を引き起こし、ステートメントが最適化されるなどのランダムなものや、さらに奇妙なものを引き起こす可能性があるのではないかと思います。
もちろん、私はこれを行うことを推奨しません。それでも、言語のルールを知ることは重要です。
Objective-CはCの上にあるオブジェクト指向のレイヤーにすぎないため、純粋なCステートメントには特別な追加の意味はありません。これによると、この場合、*(long*)0 = 0;
はCと同じように評価および解釈されるため( Cであるため)、未定義の動作を呼び出します。そのため、何もすることが保証されていません。
ヌルポインタの間接参照は、Objective-Cでは未定義のままです。
唯一の注意点は、メッセージングは間接参照を必要としないということです。nullポインター(またはObjective-C用語)へのメッセージングnil
は常に明示的に安全であり、さらにnullポインターを返すように定義されています。
したがって、のような複合メッセージング[[class alloc] init]
は常に明示的に安全です。
ステートメントが実行することが保証されているのは、未定義の動作を呼び出すことだけです。
特定のコンパイラを使用して、特定のプラットフォームで特定の処理を実行することが保証される場合があります。
その答えに見られるstrcpy(0、 "bla")は常にクラッシュしていて、それがどのように機能しないのか、またはコンパイラーによって最適化されているのかわかりません。