使用する SUBSTR 参照は、STRINGRANGE 条件が有効な場合にその条件が生じないようにして使用しなければなりません。
STRINGRANGE 条件が無効な場合 (デフォルトでは無効)、 無効な SUBSTR 参照があるとコンパイルされたコードによって他の目的で割り振られたストレージが上書きされる可能性があり、それによりデータ破損や異常終了の原因となる場合があります。
例えば以下のコードの場合、変数 n の値が 100 より大きくて SUBSTR 参照が無効な場合には、他の変数に割り振られているストレージが生成されるコードによって上書きされる可能性があります。
dcl f ext entry;
dcl a char(100);
call f( 'test' || substr(a,1,n) );
PREFIX(STRINGRANGE) コンパイラー・オプションを使用してプログラムをコンパイルしてテストする際に、こうした正しくないコードを簡単に検出できます。
V3R8 で USAGE コンパイラー・オプションに導入された SUBSTR サブオプションを使用して、この正しくないコードの一部が受け入れられるようにできます。 ただし、このオプションを使用せず、代わりにコードを訂正する (例: 上述の a の宣言が n によって想定される最大値以上の長さになるように変更する。 n の最大値が不明な場合は a の宣言の長さを 32767 に変更する) のが最善です。
一部の状態では、旧コンパイラーでは、形式 SUBSTR(X,1,N) の SUBSTR 参照のコードも生成されました (ここで、X は CHAR、N は 32767 より大きい数字)。 しかし、このような参照は無効であり、使用可能になっていれば STRINGSIZE が発生しました。 新しいコンパイラーでは、SUBSTR 参照の長さは、CHAR および BIT 参照では 32768 未満、GRAPHIC および WIDECHAR 参照では 16384 未満であることが強制されるため、 これらの規則に従わないすべてのコードは訂正する必要があります。