【PL/I学習|豆知識】メインフレームの堅牢性を高める!STRINGRANGE条件で境界外参照を防ぐ

導入:なぜSTRINGRANGEが重要なのか

メインフレーム開発において、メモリの境界外参照は深刻なABEND(異常終了)を招く最大の要因の一つです。特に文字列操作を行う際、SUBSTR関数の指定が対象変数の長さを超えてしまうと、本来読み取るべきではない隣接メモリまでアクセスしてしまいます。PL/I開発において「STRINGRANGE条件」を適切に制御することは、システムの安定稼働とバグの早期発見において極めて重要な役割を果たします。

基礎知識:STRINGRANGEとは何か

PL/IにおけるSTRINGRANGEは、文字列操作(SUBSTR関数など)において、指定された開始位置や長さが文字列の定義範囲を超えた場合に発生する「ON条件」です。
デフォルトでこの条件が有効(STRINGRANGE)になっていれば、範囲外アクセスが発生した瞬間に例外処理をフックできます。一方で、コンパイルオプションでNOSTRINGRANGEを指定すると、このチェックが省略され、パフォーマンスは向上するものの、不正なメモリ領域を読み書きするという重大なリスクを背負うことになります。

実装・解決策

プログラム内でON STRINGRANGEブロックを定義することで、万が一の範囲外アクセスに対して「システムを異常終了させる」のではなく「ログを出力して安全に処理を継続または終了させる」といった制御が可能になります。

サンプルプログラム

以下は、STRINGRANGE条件をトラップして、エラー発生時に警告を出力するサンプルコードです。

1
/ STRINGRANGEのテスト用プログラム /
TEST_PGM: PROCEDURE OPTIONS(MAIN);

DCL MSG CHAR(10) INIT(‘MAIN-FRAME’);
DCL SUB_STR CHAR(5);

/ STRINGRANGE条件が発生した時の処理を定義 /
ON STRINGRANGE BEGIN;
PUT SKIP LIST(‘警告: 文字列範囲外へのアクセスを検知しました。’);
PUT SKIP LIST(‘処理を安全に継続するため、SUBSTRを中断します。’);
END;

/ 意図的に範囲外を参照する(10文字の変数に対し、11文字目から読み取ろうとする) /
/ 通常はここでABENDしうるが、ONブロックで制御下に置く /
SUB_STR = SUBSTR(MSG, 11, 2);

PUT SKIP LIST(‘プログラムは正常に終了しました。’);
END TEST_PGM;

応用・注意点

現場で最も注意すべきは、「古いソースコードの移行時」です。過去の資産では、パフォーマンス優先のためにNOSTRINGRANGEでコンパイルされているケースが多々あります。これらを現代の基準で保守する際は、必ずコンパイルオプションを見直し、可能であればSTRINGRANGEを有効化して、潜在的なバグが隠れていないかを検証してください。

また、ON条件は多用すると実行時のオーバーヘッドが増大します。エラーチェックは可能な限りSUBSTRを呼ぶ前にLENGTH関数などで範囲を検証し、ONブロックは「予期せぬ事態への最後の砦」として使用するのが、メインフレーム技術者としての賢明な実装方針です。

コメント

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