【COBOL 読み3-7-3】未定義だとどうなるの?〜係長のやらかした人生

🧩今日の学び
EXIT FUNCTIONRETURN-VALUEを設定しない場合、値は処理系依存の「未定義」になる。
・未定義はエラーにならず、前回値やゴミ値を返して静かに事故を起こす。
FUNCTIONでは「必ず値を決めてから抜ける」ことが安全設計の最低条件である。

係長)まったく、お前のせいで話がゴチャゴチャになるわ。

なるお)変な言い回しするからですよ…。

係)い、いいか、エヴァは置いておけ、EXIT FUNCTIONの話だからな!それの「未定義」の話だからな!

な)「未定義」ってなんでしたっけ?

係)お前なぁ!

EXIT FUNCTIONを使って関数を抜けるときに戻り値を設定していないとどうなるかって話だろ!

な)あ、そうでしたね。エヴァの話がちゃんと終わってたら思い出したのにー。

係)うるせ!

目次

「未定義」とは何か:分からないのではなく保証されない

係)いいか、「未定義」は「何が返るか分からない」じゃない。

「環境ごとに、毎回違うことがある」だ。

な)はぁ?もう性能の悪いAIっすか?

今日は「晴れのち恋」、「明日は雨のち愛」とか回答しちゃうすか?

係)もう意味わからんからな…

係)再度コード確認しておけ。

FUNCTION-ID. ADD-ONE.
    IF X < 0
        MOVE 1 TO RETURN-VALUE
        EXIT FUNCTION
    END-IF
    MOVE X + 1 TO RETURN-VALUE
END FUNCTION.

RETURN-VALUEをセットせずにEXIT FUNCTIONすると、処理系・コンパイラ・最適化状態で挙動が変わる。

EXIT FUNCTIONで起きる本当の地獄

係)代表的なのはこの4つだ。

① 前回の値がそのまま返る(最悪パターン)

例えば、

  • 前回:10
  • 今回:異常系なのに 10 が返る

これは一番危険なパターンで、バグに気づかず、本番で静かに壊れてるという状況だ。

な)やらかしたんすね⋯

② メモリのゴミが返る

係)

32767
-842150451
0xDEADBEEF

などの

  • 規則性なし
  • 再現しない
  • ログ取っても意味不明

デバッグ地獄となる。

な)やらかしたんすね…

最適化で挙動が変わる

係)

  • デバッグビルド:問題なし
  • 本番ビルド:壊れる

テスト通ったのに本番死亡だ。

な)あちゃー、これもやらかしたんすね…

係)やかましい!

なんで全部やらかしたことになってんだよ。

0 や初期値っぽい値になる(処理系依存)

係)

  • たまたま 0
  • たまたまスペース
  • コンパイラが親切

「動いてるように見える」が、一番信用できない

な)信用できないって…

係)お前みたいなもんだ。

な)え!?

FUNCTIONだけが背負う責任:値を返すという契約

係)COBOLのFUNCTIONはな、「戻り値用の領域を自動初期化する義務がない」

つまりだ

  • RETURN-VALUE はただの領域
  • 何も入れなければ中身は未保証
  • 言語仕様として「未定義」

だから、定義しろって話になる。

再度EXIT PROGRAM/GOBACKとの違いを確認するとこうなる。

命令未定義の影響
EXIT PROGRAM制御だけ戻る(値なし)
GOBACK制御だけ戻る(値なし)
EXIT FUNCTION値が未定義だと即事故

このようにFUNCTION だけは「値の責任」が重いんだ。

だから実務ルールが生まれた。

FUNCTION ではEXIT の前に RETURN-VALUE を必ずセット

これが共通認識だ。

安全パターンを再度確認しておけ。

① 入口で初期化

MOVE -1 TO RETURN-VALUE

② 異常系で明示的に代入

MOVE 1 TO RETURN-VALUE
EXIT FUNCTION

③ 正常系で上書き

MOVE X + 1 TO RETURN-VALUE

いいか、未定義は「バグ」じゃないぞ、「時限爆弾」だ。

  • いつ爆発するか分からない
  • 環境で変わる
  • 再現しない

未定義が怖いのは、静かだからだな

おむすび

な)なんか係長、どんどん物騒になっていきますね⋯。

係)なんでだよ。

な)だって、喧嘩最強だっただけなのに。

係)どっからそんな話になってんだよ。

な)挙句の果てに爆弾魔だなんて、思ってもいなかったです。失望です。

係)勝手な妄想で失望してんじゃねーよ!

係長のワンポイント

未定義は「分からない」じゃない、環境次第で何でも起きるという状態だ。
怖いのはエラーにならず、正常に見えたまま壊れること。
前回値が返るのは偶然じゃなく、仕様上そうなり得る。
FUNCTIONは「値の責任」を引き受ける構造だ。
RETURN-VALUEを決めずに抜けるな、それは爆弾を置いて帰るのと同じだ。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次