【入門編】ON SUBSCRIPTRANGEによる配列添字範囲外アクセスの検知 – PL/Iの基本構文とデータ制御実践ガイド

PL/Iの「見えない落とし穴」を可視化する:ON SUBSCRIPTRANGEの魔法

こんにちは。メインフレームの世界へようこそ!

JavaやCOBOLの経験がある方なら、一度は「配列の添字(インデックス)を間違えて、とんでもないメモリ領域を書き換えてしまった……」という冷や汗ものの経験があるかもしれません。

モダンな言語であれば即座に例外(Exception)が投げられるところですが、PL/Iの世界では、かつてのハードウェアの制約や「極限まで速く実行する」という思想が色濃く残っています。そのため、デフォルトでは「ちょっとくらい範囲外でも、そのまま突き進むよ!」という、少し強気な挙動をすることがあるんです。

今日は、そんなPL/Iの「うっかり」を未然に防ぐ、`ON SUBSCRIPTRANGE`という強力な守護神について紐解いていきましょう。

1. PL/Iの基本:プログラムの「顔」を知る

まずは、PL/Iプログラムの入り口のお作法を軽くおさらいしましょう。

1
/ プログラムの入り口を定義するパッケージとメインプロシージャ /
MY_PROGRAM: PACKAGE;

MAIN_PROC: PROCEDURE OPTIONS(MAIN);

/ ここに処理を記述します /
PUT SKIP LIST(‘Hello, Mainframe World!’);

END MAIN_PROC;

END MY_PROGRAM;

PL/Iのソースコードは、基本的に`PACKAGE`で全体を囲み、その中に`PROCEDURE`を配置します。`OPTIONS(MAIN)`は、OSから直接実行される「メインプログラムですよ」という宣言です。Javaで言うところの `public static void main` と同じ役割ですね。

2. なぜ添字の範囲外が「怖い」のか?

PL/Iにおいて、配列の添字チェックはコンパイラオプションや実行時の設定に依存します。もしチェックを有効にしていなければ、定義した配列のサイズを超えて隣接するメモリ領域を書き換えても、システムは文句を言わずに処理を続行しようとします。

これが本番環境で起きると、「なぜか関係ない変数の値が化ける」「原因不明の異常終了(ABEND)が起きる」という、デバッグ泣かせの怪奇現象を引き起こす原因になります。

3. ON SUBSCRIPTRANGE:デバッグ時の守護神

ここで登場するのが、`ON SUBSCRIPTRANGE`です。これは「添字の範囲外アクセスが発生した瞬間に、プログラムをどう制御するか」を定義するトラップ機能です。

実践的なコード例

開発環境では、以下のように記述してデバッグを行うのが鉄則です。

1
MY_DEBUG_PROG: PROCEDURE OPTIONS(MAIN);

/ 添字範囲外エラーが発生した時の動作を定義 /
ON SUBSCRIPTRANGE
BEGIN;
PUT SKIP LIST(‘警告: 添字が範囲外です!’);
PUT SKIP LIST(‘プログラムを安全に停止します。’);
STOP; / 強制終了してダンプを取る準備をする /
END;

DCL MY_ARRAY(5) FIXED BIN(31) INITIAL((5)0);
DCL I FIXED BIN(31) INIT(10); / わざと範囲外の値を代入 /

/ 本来なら5までしか許されないのに、10番目にアクセスしようとする /
MY_ARRAY(I) = 999;

END MY_DEBUG_PROG;

このコードを実行すると、`MY_ARRAY(10)`にアクセスしようとした瞬間、`ON`ユニットが起動し、コンソールに警告を出してプログラムが停止します。これで、「どの地点でメモリ破壊が起きているか」を一撃で特定できるわけです。

4. 本番環境ではどうすべきか?

ここで一つ、ベテランからのアドバイスです。

「じゃあ、本番環境でも常にこのチェックをオンにすればいいのでは?」

そう思われるかもしれませんが、実は注意が必要です。`ON SUBSCRIPTRANGE`による監視は、実行時に常にメモリをチェックするため、わずかながらパフォーマンスを低下させます。超大規模なデータ処理を行うバッチにおいて、この数%のオーバーヘッドが致命的になることもあります。

私たちの現場での推奨スタンス

1. 開発・テスト環境: `SUBSCRIPTRANGE`を有効にして徹底的に叩く。
2. 本番環境: ロジックが堅牢であることを前提に、パフォーマンス優先でオフにするのが一般的。ただし、クリティカルな金融システムなどでは、あえて有効にしたまま実行することもあります。

最後に:PL/Iは怖くない!

PL/Iは古い言語ですが、その分「どう動いているか」をプログラマが細かく制御できる、非常に誠実な言語です。

`ON SUBSCRIPTRANGE`は、プログラムが暴走して迷子になる前に「ちょっと待った!」と声をかけてくれる頼もしい相棒です。もし、レガシーなソースコードを読み解いていて、「このONユニットは何だ?」と疑問に思ったら、それは先人たちが残してくれた「バグから守るための知恵」だと解釈してくださいね。

一つずつ紐解いていけば、メインフレームの深淵も怖くありませんよ。それでは、次回の記事でお会いしましょう!

タイトルとURLをコピーしました