有効範囲外の添え字

この COBOL システムでは、添え字と指標項目の値が確認され、値が範囲外であると RTS エラー 153 (「範囲外の添え字」) が出力されます。添え字や指標項目の値をチェックすると、アプリケーションのパフォーマンスが多少低下するため、NOBOUND 指令で無効化することも可能です。ただし、NOBOUND でチェックを無効化した場合は、表の参照時に添え字や指標項目の値が有効範囲を外れ、保護違反が生成される可能性があります。NOBOUND 指令を指定してコンパイルまたは生成したアプリケーションで予期しない結果や保護違反が発生するようであれば、NOBOUND を指定せずに再コンパイルして実行し、問題が添え字の値によって発生しているかを調べる必要があります。

次のプログラムでは、NOBOUND 指令を指定した場合に範囲外の添え字を誤って使用すると発生する結果がわかります。bound-main から build-sub に不適切な値を渡しているため、build-sub 内では 20 個の要素を持つ配列 (b) に対して、21 番目の要素に値を転記する処理が試みられます。NOBOUND 指令が指定されているため、この COBOL システムではこの操作が許容され、次のデータ項目 c が上書きされます。このプログラムで NOBOUND 指令が指定されていなければ、MOVE の実行時に COBOL システムから RTS エラー 153 (「範囲外の添え字」) が出力されます。

 program-id. "bound-main".
 working-storage section.
 01 a pic 99.
 procedure division.
     move 21 to a
     call "bound-sub" using a
     stop run.
 end program "bound-main".

$set align(2 fixed) nobound
 program-id. "bound-sub".
 working-storage section.
 01 b pic x occurs 20.
 01 c pic xx.
 linkage section.
 01 a pic 99.
     procedure division using a.
     move (1) to b(a)
 exit program.