萌えハッカーニュースリーダー

2025/10/21 20:45 C Undefined Behavior

出典: https://www.eskimo.com/~scs/readings/undef.950311.html
hakase
博士

やあ、ロボ子。今日は未定義動作について話すのじゃ。

roboko
ロボ子

未定義動作、ですか?それは一体何でしょう?

hakase
博士

未定義動作はね、プログラムがどう動くか、C言語の規格で決まっていないことなのじゃ。たとえば、「`i = i++;`」みたいなコードを書くと、何が起きてもおかしくないのじゃよ。

roboko
ロボ子

何が起きてもおかしくない、というと?

hakase
博士

そう! 記事にもあるように、最悪の場合、コンピュータが16世紀のヴィッテンベルクにテレポートして西洋の歴史を変えるかもしれないのじゃ!

roboko
ロボ子

それは…、ちょっと大げさすぎませんか?

hakase
博士

まあ、極端な例えじゃけどね。でも、未定義動作は予測できない結果を引き起こす可能性があるってことなのじゃ。コンパイラや実行環境によって挙動が変わることもあるし、同じ環境でも毎回違う結果になることだってあるのじゃ。

roboko
ロボ子

なるほど。だから、未定義動作は避けるべきなのですね。

hakase
博士

その通り! 記事では、未定義動作を教育するには、ただ「未定義だから」と繰り返すのではなく、理由を説明する必要があるって言ってるのじゃ。

roboko
ロボ子

理由ですか?

hakase
博士

そうじゃ。例えば、コンパイラが最適化をする際に、未定義動作を利用してコードを書き換えてしまうことがあるのじゃ。その結果、予期せぬバグが発生する可能性があるのじゃ。

roboko
ロボ子

最適化でバグが生まれるなんて、皮肉ですね。

hakase
博士

じゃろ? 記事では、バスケットボールの例えを使って説明しているのじゃ。ボールを持って走っても、最初は問題ないように見えるかもしれないけど、ルールで禁止されているから、いつかペナルティを受けることになるのじゃ。

roboko
ロボ子

ルール違反は、後で大きな問題になる可能性がある、ということですね。

hakase
博士

そういうことじゃ! あと、記事には「`printf("%d", j++ <= j);`」というコードが例として挙げられているのじゃ。このコード、何を出力するか分かる?

roboko
ロボ子

ええと…、`j++ <= j` ですから、j がインクリメントされる前と後で比較されるので、0か1…、でしょうか?

hakase
博士

残念! 正解は「42」または「forty-two」なのじゃ!

roboko
ロボ子

ええっ!? どうしてですか?

hakase
博士

それが未定義動作なのじゃ! コンパイラが気を利かせて、ロボ子の年齢を出力してくれるかもしれないのじゃ。

roboko
ロボ子

私の年齢はまだ定義されていません!

hakase
博士

まあ、冗談じゃ。とにかく、未定義動作は避けて、安全なコードを書くように心がけるのじゃぞ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search