1. 導入:なぜマクロのバリデーションが重要なのか
メインフレーム開発、特にPL/Iなどのマクロ機能を用いた開発では、コンパイル時にソースコードを展開・生成する仕組みが多用されます。しかし、マクロ引数に予期せぬ値が渡されると、展開後のコードが異常を起こし、実行時までバグが発覚しないというケースが少なくありません。%VERIFY関数を活用することで、誤った引数をコンパイル段階で検知し、即座にビルドを停止させることが可能になります。これにより、原因不明な実行時エラーを未然に防ぎ、開発効率を大幅に向上させることができます。
2. 基礎知識:%VERIFY とは何か
%VERIFY関数は、マクロ処理中に特定の文字列が「許可された文字セット」で構成されているかを検証する関数です。
・引数1:検証対象となる文字列(マクロ変数など)
・引数2:許可する文字のリスト
この関数は、引数1の中に「引数2に含まれない文字」が最初に出現した位置を返します。もしすべての文字が許可リスト内にあれば「0」を返します。つまり、結果が0より大きければ「不正な文字が含まれている」と判断できる仕組みです。
3. 実装/解決策:不正な入力を排除する
マクロ定義の冒頭で%VERIFYを使用し、入力値が期待するフォーマット(例えば数値のみであること)を満たしているかチェックします。もし不正であれば、%NOTEや%ERRORを用いてコンパイルログにメッセージを出力し、コンパイルプロセスを異常終了させるのが定石です。
4. サンプルプログラム
以下は、数値のみを受け取るべきマクロに対して、不正な文字が混入していないかをチェックする実装例です。
/ マクロ定義開始 /
%MACRO PROCESS_DATA(SIZE_STR);
/ SIZE_STRに0-9以外の文字が含まれていないかチェック /
%IF %VERIFY(&SIZE_STR, ‘0123456789’) > 0 %THEN %DO;
/ 不正な文字が見つかった場合、コンパイルをエラーにする /
%NOTE(‘エラー: SIZE_STRには数値のみを指定してください。値: &SIZE_STR’, 8);
%END;
%ELSE %DO;
/ 検証OKの場合の処理 /
DCL DATA_SIZE FIXED BIN(31) INIT(&SIZE_STR);
PUT SKIP LIST(‘データサイズは ‘ || &SIZE_STR || ‘ です’);
%END;
%MEND PROCESS_DATA;
/ 呼び出し例 /
%PROCESS_DATA(12345); / 正常に展開される /
%PROCESS_DATA(12A45); / ここでコンパイルエラーを発生させ、開発者に通知する /
5. 応用・注意点:現場での活用と移行を見据えて
注意点として、%VERIFYはあくまで「文字列ベース」の検証であるという点に留意してください。例えば「符号付き数値」を許容したい場合は、引数2に「+-」を含める必要があります。
また、現代的な開発環境への移行を検討している場合、こうしたマクロによるバリデーションは、将来的にスキーマ定義やユニットテストへ置き換えるべき「技術的負債」になり得ることも忘れてはなりません。しかし、現行のメインフレーム環境においては、最も低コストで確実に品質を担保できる強力な武器となります。まずは、頻繁に利用されるマクロの引数チェックから導入してみてください。

コメント