32.7.4 初期化漏れチェック機能
ここでは,初期化漏れチェック機能の使用方法について説明します。
- 〈この項の構成〉
(1) 初期化漏れチェック機能の概要
初期化漏れチェック機能とは,データ項目を参照しているが,値の設定(初期化)がされていない,またはその可能性のあるデータ項目を「初期化漏れ」として検出する機能です。
実行時に検出される初期化漏れが原因の不良は,不良個所の特定のために複数のプログラムにわたった調査が必要になります。このため,不良個所の特定に時間が掛かることがあります。初期化漏れチェック機能を使用すると,コンパイル時に初期化漏れを検出でき,テスト工程前に対策できるため,COBOLプログラムの開発効率を向上できます。
初期化漏れチェック機能で「初期化漏れ」を検出するCOBOLソースの例を次の図に示します。
(2) 初期化漏れチェック機能を使用するときに指定するコンパイラオプション
初期化漏れチェック機能を使用する場合は,コンパイル時に次のオプションを同時に指定します。
-
-Compile,CheckOnlyオプション※
-Compile,CheckOnlyオプションについては,「32.5.10 リンクの設定」の「(1) -Compileオプション」を参照してください。
-
-CheckUninitDataオプション
-CheckUninitDataオプションについては,「32.5.14 その他の設定」の「(24) -CheckUninitDataオプション」を参照してください。
- 注※
-
次の場合,-Compile,CheckOnlyオプションが無効となるため,初期化漏れチェック機能も無効になります。
-
明示的に-Compile,NoLinkオプションを指定した場合
-
- 注意事項
-
-
初期化漏れチェック機能は,-CBLVALUEオプションおよび環境変数CBLVALUE,ならびに環境変数CBLINITVALUE指定時に設定される初期値を無視します。
-
初期化漏れチェック機能は,プログラムを実行したときに通る可能性のある経路(制御ブロック)をすべて走査し,手続き文で参照されているデータ項目の初期化漏れをチェックします。ただし,環境変数CBL_UNINITDATA_BREAKOFFの指定が無効な場合に,走査した制御ブロックの数が上限を超えたときは,初期化漏れチェック機能の警告メッセージを出力して,初期化漏れチェック処理を打ち切ります。環境変数CBL_UNINITDATA_BREAKOFFについては,「32.6.3 コンパイラ環境変数の詳細」の「(2) CBL_UNINITDATA_BREAKOFF」を参照してください。
-
(3) 初期化漏れチェック機能の使用方法
初期化漏れチェック機能を使用するときの作業の流れを次の図に示します。初期化漏れチェック機能を使用する前に,あらかじめSレベル,Uレベルのコンパイルエラーがないことを確認してください。
初期化漏れチェック機能は,次の方法で使用できます。
-
コンパイルリストから調査する
(a) コンパイルリストから調査する方法
コンパイルリストから初期化漏れを調査する手順を次に示します。
-
-CheckUninitDataオプション,-Compile,CheckOnlyオプションおよび-SrcListオプションを指定してコンパイルする。
コンパイルリストに初期化漏れチェックの結果が出力されます。
-
コンパイルリストまたは標準エラー出力に,初期化漏れチェック機能の警告メッセージが出力されていないかを確認する。
-
初期化漏れチェック機能の警告メッセージが出力されている場合は,メッセージの内容を確認して,初期化漏れの可能性があるデータ項目に,値設定が必要かどうかを確認する。
-
値設定が必要な場合は,プログラムを修正する。
(4) 初期化漏れチェック機能使用時の注意事項
-
次の表に示す機能に該当するデータ項目は,初期化漏れチェック機能の対象外となり,常に初期化済みと判定されます。
項番
機能
1
オブジェクト指向機能
-
オブジェクトビュー
-
オブジェクトプロパティ
-
SELFおよびSUPER
-
オブジェクト参照
-
INVOKE文
など
2
利用者定義関数
3
連絡節で定義されているデータ項目
4
EXTERNAL句またはGLOBAL句が指定されているデータ項目またはその従属項目
5
コンパイル対象とならない行
-
コメント行
-
デバッグ行(-DebugLineオプション未指定時)
-
条件翻訳の無効行
6
制御が渡らない文,手続き
7
覚え書きとみなされた構文
8
Sレベル,Uレベルエラーが発生するCOBOL原始プログラムファイル
9
宣言部分の文,手続き(USE文の宣言手続き)
10
XDMによるデータベース操作シミュレーション機能
-
構造型データベース操作シミュレーション機能(XDM/SD)
-
リレーショナルデータベース操作シミュレーション機能(XDM/RD)
11
ADDRESSED BY句が指定されているデータ項目,またはその従属項目
12
可変部分に定義されたデータ項目
13
動的長基本項目
14
報告書作成機能
15
被再定義項目が初期化漏れチェック機能のチェック対象外である再定義項目およびその従属項目すべて※1※2
16
被再命名項目が初期化漏れチェック機能のチェック対象外である再命名項目※2
17
再定義項目が初期化漏れチェック機能のチェック対象外である被再定義項目およびその従属項目すべて※2
18
RENAMES句にTHRU指定がある再命名項目※3
19
合成キー
20
すべての従属項目が初期化漏れチェック機能のチェック対象外であるデータ項目
注※1
チェック対象外であるデータ項目を再定義した例を次に示す。
(例)
022000 WORKING-STORAGE SECTION. 023000 01 DAT1 EXTERNAL PIC X. 024000 01 DAT2 REDEFINES DAT1 PIC X. : 039000 043000 DISPLAY DAT2. ← DAT2はチェック対象外
DAT2の被再定義項目DAT1が,初期化漏れチェックの対象外(EXTERNAL句指定のデータ項目)であるため,DAT2もチェックされません。
注※2
チェック対象外のデータ項目で再定義した例を次に示します。
(例)
022000 WORKING-STORAGE SECTION. 023000 01 DAT1. 023100 03 DAT11 PIC X. 023200 66 DAT12 RENAMES DAT11. 024000 01 DAT2 REDEFINES DAT1 PIC 9. 025000 01 DAT3 REDEFINES DAT1 GLOBAL. 025100 03 DAT31 PIC X. 025200 66 DAT32 RENAMES DAT31. : 039000 040000 DISPLAY DAT31 DAT32. ← DAT31,DAT32はチェック対象外 041000 DISPLAY DAT1 DAT2. ← DAT1,DAT2はチェック対象外 042000 DISPLAY DAT11 DAT12. ← DAT11,DAT12はチェック対象外
再定義項目DAT3が,初期化漏れチェックの対象外(GLOBAL句指定のデータ項目)であるため,DAT3と領域を共有する次の項目もチェックされません。
・DAT3の従属項目DAT31とDAT31の再命名項目DAT32
・DAT3の被再定義項目DAT1,およびDAT1の従属項目DAT11とDAT11の再命名項目DAT12
・DAT1の再定義項目DAT2
注※3
THRU指定がある再命名項目がチェック対象外となる例を次に示します。
(例)
022000 WORKING-STORAGE SECTION. 023000 01 DAT1. 024000 03 DAT2. 025000 05 DAT3 PIC X. 026000 05 DAT4 PIC 9. 027000 05 DAT5 PIC 9. 028000 05 DAT6 PIC X. 029000 66 R-DAT RENAMES DAT3 THRU DAT6. : 043000 DISPLAY R-DAT. ← R-DATはチェック対象外
-
-
ファイル節のレコードの初期化漏れチェックは,作業場所節と同じ扱いとなります。
-
手続き文の作用対象に添字付きデータ名が指定された場合,値参照または値設定の対象は,反復データ項目またはその従属項目のすべてとします。
(例)
01 DAT1 . 03 DAT2 OCCURS 10. 05 DAT3 PIC X(1). 05 DAT4 PIC X(1). : MOVE SPACE TO DAT3(1). ← DAT3のすべての要素を初期化済みとみなす DISPLAY DAT3(2). ← DAT3は初期化済みと判定される DISPLAY DAT4(3). ← DAT4は初期化漏れの可能性ありと検出される MOVE SPACE TO DAT2(4). ← DAT2の4番目の要素に半角空白を設定する DISPLAY DAT2(1) DAT3(2) DAT4(3). ← DAT2およびその従属項目は初期化済と判定される
-
手続き文の作用対象に部分参照付きデータ名が指定された場合,値参照または値設定の対象は,データ項目またはその従属項目すべてとします。
(例)
01 DAT1 . 03 DAT2 PIC X(5). 03 DAT3 PIC X(5). : MOVE SPACE TO DAT2(5:1). ← DAT2全体が初期化されたものとみなす DISPLAY DAT2(1:3). ← DAT2は初期化済みと判定される MOVE SPACE TO DAT1(1:5). ← DAT1全体が初期化されたものとみなす DISPLAY DAT1 DAT2 DAT3. ← DAT1およびその従属項目すべて初期化済みと判定される