1. 導入:なぜSTRINGRANGE条件が重要なのか
メインフレームのPL/I開発において、文字列操作は日常茶飯事ですが、その中でもSUBSTR関数は最も利用頻度が高い機能の一つです。しかし、指定した範囲が文字列の長さを超えていた場合、プログラムはどう振る舞うべきでしょうか。デフォルト設定のままでは、意図しないメモリ領域を参照し、誤ったデータで処理が続行される「サイレント障害」を引き起こすリスクがあります。本稿では、STRINGRANGE条件を活用した例外処理の実装方法を解説します。
2. 基礎知識:STRINGRANGE (STRG) とは
STRINGRANGE(略称:STRG)は、PL/Iの条件の一つです。SUBSTR関数において、開始位置や長さが定義された文字列の境界を超えた場合に、この条件が発生(raise)します。
もしこの条件が「無効(NOSUBSTR)」に設定されていると、PL/Iは境界外のメモリをそのまま読み取ろうとします。これは、現代のJavaなどで見られるStringIndexOutOfBoundsExceptionとは異なり、システムがエラーで止まらずに異常な値のまま突き進むという、メインフレーム特有の危険な挙動を許容してしまう可能性があるため、明示的な制御が不可欠です。
3. 実装・解決策:ON-UNITによる例外捕捉
STRINGRANGE条件を有効化し、ON-UNITを使用して例外をキャッチすることで、異常発生時にログを出力したり、処理を安全に中断したりすることが可能です。
4. サンプルプログラム
以下のコードは、範囲外アクセスが発生した際に、ON-UNITを使用してエラーログを表示し、処理を安全に制御する例です。
/i
/ STRINGRANGE条件を有効化する /
(STRINGRANGE): PROCEDURE OPTIONS(MAIN);
DCL A CHAR(10) INIT(‘ABCDEFGHIJ’);
DCL RESULT CHAR(1);
/ STRINGRANGE発生時の例外処理を定義 /
ON STRINGRANGE BEGIN;
PUT SKIP LIST(‘警告: 文字列の範囲外アクセスを検知しました’);
/ ここに異常終了処理やダンプ取得などを記述 /
END;
/ 明示的に範囲外(開始位置12、長さ1)を指定 /
/ 条件が有効なため、ON-UNITが実行される /
RESULT = SUBSTR(A, 12, 1);
PUT SKIP LIST(‘処理を続行します’);
END;
5. 応用・注意点:現場での運用Tips
実務において最も注意すべきは、「古いソースコードの移行時」です。一部のレガシーなプログラムでは、あえてNOSUBSTRを指定し、メモリ上の隣接領域をスキャンして処理を行うようなハック的なコードが存在することがあります。
移行や改修の際には、以下の点を確認してください。
・コンパイラオプションの確認: コンパイル時のオプションでNOSUBSTRが指定されていないかを確認してください。
・論理精査: 明示的に範囲外アクセスを利用している箇所がある場合、それはメモリ破壊の原因となるため、最新のコーディング規約に基づき、標準的なロジックへの修正を検討してください。
適切な条件設定を行うことは、データ整合性を守り、デバッグコストを大幅に削減するための第一歩です。日々の保守において、ぜひこの監視ポイントを見直してみてください。

コメント