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) 初期化漏れチェック機能で出力するファイル
初期化漏れチェック機能では,この機能でチェックした初期化漏れの可能性があるデータ項目を,次に示す一覧でファイルに出力することもできます。
-
初期化漏れ確認結果一覧
-
初期化漏れ従属項目一覧
これらの一覧を出力する場合は,環境変数CBLUNINITDATA_OUTRESULTLISTにONを指定します。環境変数CBLUNINITDATA_OUTRESULTLISTの詳細は,「32.6.3 コンパイラ環境変数の詳細」の「(17) CBLUNINITDATA_OUTRESULTLIST」を参照してください。
また,これらの一覧の出力先を変更する場合は,環境変数CBLUNINITDATA_OUTRESULTLISTDIRに出力先ディレクトリを指定します。環境変数CBLUNINITDATA_OUTRESULTLISTDIRの詳細は,「32.6.3 コンパイラ環境変数の詳細」の「(18) CBLUNINITDATA_OUTRESULTLISTDIR」を参照してください。
初期化漏れチェック機能で出力するファイルの共通規則を次に示します。
- 共通規則
-
-
ファイルはCSV形式です。
-
ファイルの1行目は列名を表します。2行目以降は列に対する内容の値を表します。
-
各項目は引用符(")で囲みます。ただし,項目の値がない場合は囲みません。
"列名1","列名2","列名3",…
"値1",,"値3",…
-
ファイルの文字コードはCOBOLソースファイルの文字コードと同じです。
-
ファイルは,コンパイルの対象となるCOBOLソースファイルの単位に出力します。
-
ファイルは,コンパイルごとに上書きして出力します。
-
ファイル入出力でエラーが発生した場合,メッセージを出力し,処理を中断します。
-
(a) 初期化漏れ確認結果一覧
初期化漏れ確認結果一覧は,初期化漏れチェック機能でチェックした,初期化漏れの可能性があるデータ項目の情報を出力する一覧です。初期化漏れ確認結果一覧は,初期化漏れのメッセージごとに,次に示す形式で情報を出力します。
- 初期化漏れ確認結果一覧の形式
-
列名
内容
#
初期化漏れ確認結果一覧内の一意な通番です。
ディレクトリ名
COBOLソースファイルがあるディレクトリ名です。
ファイル名
COBOLソースファイル名です。
プログラム名
プログラム名です。
COPY定義ディレクトリ名
メッセージが出力された個所が登録集原文内である場合,登録集原文があるディレクトリ名です。登録集原文内でない場合は何も出力されません。
COPYファイル名
メッセージが出力された個所が登録集原文内である場合,登録集原文のファイル名。登録集原文内でない場合は何も出力されません。
一連番号
メッセージが出力された,コンパイルリストの原始プログラムリストに表示される行番号です。
ファイル内行番号
メッセージが出力された,COBOLソースファイルまたは登録集原文ファイル内の相対行番号です。
ただし,埋め込みSQL文の場合,メッセージは語「EXEC」の位置に出力されますが,ここにはデータ項目の位置が出力されます。
ファイル内カラム
メッセージが出力された,COBOLソースファイルまたは登録集原文ファイル内のカラム番号です。
ただし,埋め込みSQL文の場合,メッセージは語「EXEC」の位置に出力されますが,ここにはデータ項目の位置が出力されます。
データ項目名
データ項目の修飾付きデータ名です。
修飾付きデータ名の形式を次に示します。
データ名 〔OF 集団項目名〕…〔IN ファイル名〕
従属項目一覧有無
初期化漏れ従属項目一覧への情報の出力有無を0または1で示します。
0:初期化漏れ従属項目一覧へ情報は出力していません。
1:初期化漏れ従属項目一覧に情報を出力しています。
- 初期化漏れ確認結果一覧の規則
-
-
初期化漏れ確認結果一覧のファイル名称は,「<COBOLソースファイル名(拡張子を除く)>-UninitCheckResult.csv」です。
(例)COBOLソースファイル名が「Prog1.cbl」の場合
Prog1-UninitCheckResult.csv
-
初期化漏れ確認結果一覧のファイルは,初期化漏れの可能性があるデータ項目を検出しなかった場合でも出力します。
-
- 初期化漏れ確認結果一覧の出力例
-
- COBOLソースファイル
000100 IDENTIFICATION DIVISION. 000200 PROGRAM-ID. MAIN. 000300 DATA DIVISION. 000400 WORKING-STORAGE SECTION. 000500 01 A PIC X. 000600 01 B PIC X VALUE 'B'. 000700 01 C. 000800 03 C1 PIC X. 000900 03 C2 PIC X. 001000 PROCEDURE DIVISION. 001100 DISPLAY A. 001200 IF B = 'B' THEN 001300 MOVE SPACE TO C 001400 PERFORM SEC1 001500 ELSE 001600 PERFORM SEC1 001700 END-IF. 001800 STOP RUN. 001900 002000 SEC1. 002100 COPY SAMPLECOPY. 002200 002300 END PROGRAM MAIN.
- 登録集原文
DISPLAY C1.
- コンパイルリストの原始プログラムリスト
- 初期化漏れ確認結果一覧
"#","ディレクトリ名","ファイル名","プログラム名","COPY定義ディレクトリ名","COPYファイル名","一連番号","ファイル内行番号","ファイル内カラム","データ項目名","従属項目一覧有無" "1","/usr/user/WORK","Prog1.CBL","MAIN",,,"001100","11","20","A","0" "2","/usr/user/WORK","Prog1.CBL","MAIN","/usr/user/WORK/COPY","SAMPLECOPY.CBL","2101","1","20","C1 OF C","0"
(b) 初期化漏れ従属項目一覧
初期化漏れ従属項目一覧は,初期化漏れチェック機能でチェックした,初期化漏れの可能性があるデータ項目が集団項目である場合に,その従属項目の情報を出力する一覧です。初期化漏れ従属項目一覧は,次に示す形式で情報を出力します。
- 初期化漏れ従属項目一覧の形式
-
列名
内容
#
初期化漏れ従属項目一覧内の一意な通番です。
確認結果一覧の#
初期化漏れ確認結果一覧での#(通番)です。
従属項目名
初期化漏れの可能性がある従属項目の修飾付きデータ名です。
修飾付きデータ名の形式を次に示します。
データ名 〔OF 集団項目名〕…〔IN ファイル名〕
初期化漏れの可能性がある従属項目がFILLER項目の場合は,データ名をFILLERとみなした修飾付きデータ名です。なお,対象は,従属項目のうち基本項目だけとなります。
- 初期化漏れ従属項目一覧の規則
-
-
初期化漏れ従属項目一覧のファイル名称は,「<COBOLソースファイル名(拡張子を除く)>-UninitCheckSubordinate.csv」です。
(例)COBOLソースファイル名がProg1.cblの場合
Prog1-UninitCheckSubordinate.csv
-
初期化漏れ従属項目一覧のファイルは,初期化漏れ確認結果一覧での初期化漏れの可能性があるデータ項目に集団項目がない場合でも出力します。
-
- 初期化漏れ従属項目一覧の出力例
-
- COBOLソースファイル
IDENTIFICATION DIVISION. PROGRAM-ID. MAIN. DATA DIVISION. WORKING-STORAGE SECTION. 01 A. 03 A1. 05 A11 PIC X. 03 A2. 05 A21 PIC X. 01 B. 03 B1. 05 B11 PIC X. 03 B2. 05 B21 PIC X. PROCEDURE DIVISION. DISPLAY A. MOVE SPACE TO B1. DISPLAY B. END PROGRAM MAIN.
- コンパイルリストの原始プログラムリスト
- 初期化漏れ確認結果一覧
"#","ディレクトリ名","ファイル名","プログラム名","COPY定義ディレクトリ名","COPYファイル名","一連番号","ファイル内行番号","ファイル内カラム","データ項目名","従属項目一覧有無" "1","/usr/user/WORK","Prog1.CBL","MAIN",,,"16","16","20","A","1" "2","/usr/user/WORK","Prog1.CBL","MAIN",,,"19","19","20","B","1"
- 初期化漏れ従属項目一覧
"#","確認結果一覧の#","従属項目名" "1","1","A11 OF A1 OF A" "2","1","A21 OF A2 OF A" "3","2","B21 OF B2 OF B"
(4) 初期化漏れチェック機能の使用方法
初期化漏れチェック機能を使用するときの作業の流れを次の図に示します。初期化漏れチェック機能を使用する前に,あらかじめSレベル,Uレベルのコンパイルエラーがないことを確認してください。
初期化漏れチェック機能は,次の方法で使用できます。
-
コンパイルリストから調査する
(a) コンパイルリストから調査する方法
コンパイルリストから初期化漏れを調査する手順を次に示します。
-
-CheckUninitDataオプション,-Compile,CheckOnlyオプションおよび-SrcListオプションを指定してコンパイルする。
コンパイルリストに初期化漏れチェックの結果が出力されます。
-
コンパイルリストまたは標準エラー出力に,初期化漏れチェック機能の警告メッセージが出力されていないかを確認する。
-
初期化漏れチェック機能の警告メッセージが出力されている場合は,メッセージの内容を確認して,初期化漏れの可能性があるデータ項目に,値設定が必要かどうかを確認する。
-
値設定が必要な場合は,プログラムを修正する。
(5) 初期化漏れチェック機能使用時の注意事項
-
次の表に示す機能に該当するデータ項目は,初期化漏れチェック機能の対象外となり,常に初期化済みと判定されます。
項番
機能
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およびその従属項目すべて初期化済みと判定される
-
被再定義項目と再定義項目,同じ被再定義項目を持つ再定義項目など,再定義によって同じ記憶域に関連づけられた2つの集団項目で,一方の集団項目の従属項目に値が設定されたとき,もう一方の集団項目の従属項目は,値が設定された従属項目と同じ領域であったとしても,初期化済みとはみなしません。
(例)
01 A. 03 A-1 PIC X. 03 A-2 PIC X. 01 B REDEFINES A. 03 B-1 PIC X. 03 B-2 PIC X. : MOVE '1' TO A-1. *> 被再定義項目の集団項目Aの従属項目A-1に値を設定 DISPLAY B-1. *> 再定義項目の集団項目Bの,A-1と同じ領域の従属項目 *> B-1を初期化漏れの可能性ありと判定する ? KCCC6951C-W データ名"B-1"は,初期化されていない可能性があります。
-
被再定義項目と再定義項目,同じ被再定義項目を持つ再定義項目など,再定義によって同じ記憶域に関連づけられた2つのデータ項目がある場合に,一方が初期化済みであるときは,もう一方のデータ項目およびその従属項目はすべて初期化済みとみなします。このため,初期化済みのデータ項目の長さが,もう一方のデータ項目の長さより短かったとしても,もう一方のデータ項目およびその従属項目を初期化漏れの可能性ありとは判定しません。
(例)
01 A. 03 A-1 PIC X. 03 A-2 PIC X. 01 B REDEFINES A PIC X. : MOVE '0' TO B. *> 再定義項目のBに値を設定 DISPLAY A-2. *> BよりもAの方がデータ項目の長さが長いが, *> 被再定義項目の集団項目Aの従属項目A-2は *> 初期化漏れの可能性ありとは判定しない