12.7.1 解析対象に関わる実行文とデータ項目の抽出
制御フローを考慮した解析では,データ項目に対する影響調査やソースコードを理解しやすくするために,選択した解析対象に関わる実行文とデータ項目を抽出します。制御フローを考慮した解析を使用する場合は,解析対象として実行文と作用対象のデータ項目を指定します。データ影響波及分析では,制御フローに基づいて,指定した実行文と作用対象のデータ項目の影響波及元または影響波及先を解析し,次の情報を抽出してファイルに出力します。
-
プログラム内のある特定の実行文で使用されるデータ項目に,影響を与える作用対象の実行文とデータ項目の集合
-
プログラム内のある特定の実行文で使用されるデータ項目から,影響を受ける作用対象の実行文とデータ項目の集合
制御フローを考慮した解析の例を次に示します。
- (例)
-
解析対象として,COBOLソースプログラムの8行目のMOVE文と,そのMOVE文に含まれる作用対象データ項目の「Z」を指定する例です。
- (例の説明)
-
制御フローとデータフローに示すように,「Z」の影響波及元を解析し,影響を与える作用対象の実行文とデータ項目を抽出します。この解析では,解析対象に関わる実行文として,条件分岐文の条件部分なども抽出します。
制御フローを考慮した解析では,「12.3.1 明示的影響2項関係」の「表12-4 影響2項関係を抽出するCOBOL実行文と抽出する影響2項関係」に示す実行文に加えて,次の表に示す実行文も抽出します。制御フローを考慮した解析で抽出するCOBOL実行文と抽出条件を次に示します。
分類 |
文 |
コード例 |
行番号の文の抽出条件 |
---|---|---|---|
選択可能な条件指定ができる手続き文 |
ACCEPT文 |
<ブロックA> 1.ACCEPT … 2.ON EXCEPTION <ON EXCEPTIONブロック> 3.NOT ON EXCEPTION <NOT ON EXCEPTIONブロック> 4.END-ACCEPT <ブロックB> |
1.:ACCEPT文の処理,またはON EXCEPTIONもしくはNOT ON EXCEPTIONブロック内で解析対象に関する実行文が抽出された場合 2.:ON EXCEPTIONブロック内で解析対象に関する実行文が抽出された場合 3.:NOT ON EXCEPTIONブロック内で解析対象に関する実行文が抽出された場合 4.:明示範囲終了子のEND-ACCEPTは抽出されない |
ADD文 |
<ブロックA> 1.ADD … TO … 2.ON SIZE ERROR <ON SIZE ERRORブロック> 3.NOT ON SIZE ERROR <NOT ON SIZE ERRORブロック> 4.END-ADD <ブロックB> |
1.:ADD文の処理,またはON SIZE ERRORもしくはNOT ON SIZE ERRORブロック内で解析対象に関する実行文が抽出された場合 2.:ON SIZE ERRORブロック内で解析対象に関する実行文が抽出された場合 3.:NOT ON SIZE ERRORブロック内で解析対象に関する実行文が抽出された場合 4.:明示範囲終了子のEND-ADDは抽出されない |
|
CALL文 |
<ブロックA> 1.CALL … 2.ON EXCEPTION <ON EXCEPTIONブロック> 3.NOT ON EXCEPTION <NOT ON EXCEPTIONブロック> 4.END-CALL <ブロックB> |
1.:CALL文の処理,またはON EXCEPTIONもしくはNOT ON EXCEPTIONブロック内で解析対象に関する実行文が抽出された場合 2.:ON EXCEPTIONブロック内で解析対象に関する実行文が抽出された場合 3.:NOT ON EXCEPTIONブロック内で解析対象に関する実行文が抽出された場合 4.:明示範囲終了子のEND-CALLは抽出されない |
|
<ブロックA> 1.CALL … 2.ON OVERFLOW <ON OVERFLOWブロック> 3.END-CALL <ブロックB> |
1.:CALL文の処理,またはON OVERFLOWブロック内で解析対象に関する実行文が抽出された場合 2.:ON OVERFLOWブロック内で解析対象に関する実行文が抽出された場合 3.:明示範囲終了子のEND-CALLは抽出されない |
||
COMPUTE文 |
<ブロックA> 1.COMPUTE … = … 2.ON SIZE ERROR <ON SIZE ERRORブロック> 3.NOT ON SIZE ERROR <NOT ON SIZE ERRORブロック> 4.END-COMPUTE <ブロックB> |
1.:COMPUTE文の処理,またはON SIZE ERRORもしくはNOT ON SIZE ERRORブロック内で解析対象に関する実行文が抽出された場合 2.:ON SIZE ERRORブロック内で解析対象に関する実行文が抽出された場合 3.:NOT ON SIZE ERRORブロック内で解析対象に関する実行文が抽出された場合 4.:明示範囲終了子のEND-COMPUTEは抽出されない |
|
DELETE文 |
<ブロックA> 1.DELETE … RECORD 2.INVALID KEY <ON INVALID KEYブロック> 3.NOT INVALID KEY <NOT INVALID KEYブロック> 4.END-DELETE <ブロックB> |
1.:INVALID KEYまたはNOT INVALID KEYブロック内で解析対象に関する実行文が抽出された場合 2.:INVALID KEYブロック内で解析対象に関する実行文が抽出された場合 3.:NOT INVALID KEYブロック内で解析対象に関する実行文が抽出された場合 4.:明示範囲終了子のEND-DELETEは抽出されない |
|
DISPLAY文 |
<ブロックA> 1.DISPLAY … UPON … 2.ON EXCEPTION <ON EXCEPTIONブロック> 3.NOT ON EXCEPTION <NOT ON EXCEPTIONブロック> 4.END-DISPLAY <ブロックB> |
1.:DISPLAY文の処理,またはON EXCEPTIONもしくはNOT ON EXCEPTIONブロック内で解析対象に関する実行文が抽出された場合 2.:ON EXCEPTIONブロック内で解析対象に関する実行文が抽出された場合 3.:NOT ON EXCEPTIONブロック内で解析対象に関する実行文が抽出された場合 4.:明示範囲終了子のEND-DISPLAYは抽出されない |
|
DIVIDE文 |
<ブロックA> 1.DIVIDE … INTO … 2.ON SIZE ERROR <ON SIZE ERRORブロック> 3.NOT ON SIZE ERROR <NOT ON SIZE ERRORブロック> 4.END-DIVIDE <ブロックB> |
1.:DIVIDE文の処理,またはON SIZE ERRORもしくはNOT ON SIZE ERRORブロック内で解析対象に関する実行文が抽出された場合 2.:ON SIZE ERRORブロック内で解析対象に関する実行文が抽出された場合 3.:NOT ON SIZE ERRORブロック内で解析対象に関する実行文が抽出された場合 4.:明示範囲終了子のEND-DIVIDEは抽出されない |
|
EVALUATE文 |
<ブロックA> 1.EVALUATE … 2.WHEN … <WHENブロック1> : 3.WHEN … <WHENブロックN> : 4.WHEN OTHER <WHEN OTHERブロック> 5.END-EVALUATE <ブロックB> |
1.:どれかのWHENブロック内,またはWHEN OTHERブロック内で解析対象に関する実行文が抽出された場合 2.:対応するWHENブロック内で解析対象に関する実行文が抽出された場合(ソース例のWHENブロック1が該当) 3.:対応するWHENブロック内で解析対象に関する実行文が抽出された場合(ソース例のWHENブロックNが該当) 4.:WHEN OTHERブロック内で解析対象に関する実行文が抽出された場合 5.:明示範囲終了子のEND-EVALUATEは抽出されない |
|
IF文 |
<ブロックA> 1.IF <判定文> THEN <THENのブロック> 2.ELSE <ELSEのブロック> 3.END-IF <ブロックB> |
1.:THENブロック内または,ELSEブロック内で解析対象に関する実行文が抽出された場合 2.:ELSEブロック内で解析対象に関する実行文が抽出された場合 3.:明示範囲終了子のEND-IFは抽出されない |
|
MULTIPLY文 |
<ブロックA> 1.MULTIPLY … BY … 2.ON SIZE ERROR <ON SIZE ERRORブロック> 3.NOT ON SIZE ERROR <NOT ON SIZE ERRORブロック> 4.END-MULTIPLY <ブロックB> |
1.:MULTIPLY文の処理,またはON SIZE ERRORもしくはNOT ON SIZE ERRORブロック内で解析対象に関する実行文が抽出された場合 2.:ON SIZE ERRORブロック内で解析対象に関する実行文が抽出された場合 3.:NOT ON SIZE ERRORブロック内で解析対象に関する実行文が抽出された場合 4.:明示範囲終了子のEND-MULTIPLYは抽出されない |
|
READ文 |
<ブロックA> 1.READ … RECORD … 2.AT END <AT ENDブロック> 3.NOT AT END <NOT AT ENDブロック> 4.END-READ <ブロックB> |
1.:READ文の処理,またはAT ENDもしくはNOT AT ENDブロック内で解析対象に関する実行文が抽出された場合 2.:AT ENDブロック内で解析対象に関する実行文が抽出された場合 3.:NOT AT ENDブロック内で解析対象に関する実行文が抽出された場合 4.:明示範囲終了子のEND-READは抽出されない |
|
RETURN文 |
<ブロックA> 1.RETURN … RECORD … 2.AT END <AT ENDブロック> 3.NOT AT END <NOT AT ENDブロック> 4.END-RETURN <ブロックB> |
1.:RETURN文の処理,またはAT ENDもしくはNOT AT ENDブロック内で解析対象に関する実行文が抽出された場合 2.:AT ENDブロック内で解析対象に関する実行文が抽出された場合 3.:NOT AT ENDブロック内で解析対象に関する実行文が抽出された場合 4.:明示範囲終了子のEND-RETURNは抽出されない |
|
REWRITE文 |
<ブロックA> 1.REWRITE … 2.INVALID KEY <INVALID KEYブロック> 3.NOT INVALID KEY <NOT INVALID KEYブロック> 4.END-REWRITE <ブロックB> |
1.:INVALID KEYまたはNOT INVALID KEYブロック内で解析対象に関する実行文が抽出された場合 2.:INVALID KEYブロック内で解析対象に関する実行文が抽出された場合 3.:NOT INVALID KEYブロック内で解析対象に関する実行文が抽出された場合 4.:明示範囲終了子のEND-REWRITEは抽出されない |
|
SEARCH文 |
<ブロックA> 1.SEARCH … 2.AT END <AT ENDブロック> 3.WHEN <WHENブロック> 4.END-SEARCH <ブロックB> |
1.:SEARCH文の処理,またはAT ENDブロック内で解析対象に関する実行文が抽出された場合 2.:AT ENDブロック内で解析対象に関する実行文が抽出された場合 3.:WHENブロック内で解析対象に関する実行文が抽出された場合 4.:明示範囲終了子のEND-SEARCHは抽出されない |
|
START文 |
<ブロックA> 1.START … 2.INVALID KEY <INVALID KEYブロック> 3.NOT INVALID KEY <NOT INVALID KEYブロック> 4.END-START <ブロックB> |
1.:INVALID KEYまたはNOT INVALID KEYブロック内で解析対象に関する実行文が抽出された場合 2.:INVALID KEYブロック内で解析対象に関する実行文が抽出された場合 3.:NOT INVALID KEYブロック内で解析対象に関する実行文が抽出された場合 4.:明示範囲終了子のEND-STARTは抽出されない |
|
STRING文 |
<ブロックA> 1.STRING … 2.ON OVERFLOW <ON OVERFLOWブロック> 3.NOT ON OVERFLOW <NOT ON OVERFLOWブロック> 4.END-STRING <ブロックB> |
1.:STRING文の処理,またはON OVERFLOWもしくはNOT ON OVERFLOWブロック内で解析対象に関する実行文が抽出された場合 2.:ON OVERFLOWブロック内で解析対象に関する実行文が抽出された場合 3.:NOT ON OVERFLOWブロック内で解析対象に関する実行文が抽出された場合 4.:明示範囲終了子のEND-STRINGは抽出されない |
|
SUBTRACT文 |
<ブロックA> 1.SUBTRACT … FROM … 2.ON SIZE ERROR <ON SIZE ERRORブロック> 3.NOT ON SIZE ERROR <NOT ON SIZE ERRORブロック> 4.END-SUBTRACT <ブロックB> |
1.:SUBTRACT文の処理,またはON SIZE ERRORもしくはNOT ON SIZE ERRORブロック内で解析対象に関する実行文が抽出された場合 2.:ON SIZE ERRORブロック内で解析対象に関する実行文が抽出された場合 3.:NOT ON SIZE ERRORブロック内で解析対象に関する実行文が抽出された場合 4.:明示範囲終了子のEND-SUBTRACTは抽出されない |
|
UNSTRING文 |
<ブロックA> 1.UNSTRING … 2.ON OVERFLOW <ON OVERFLOWブロック> 3.NOT ON OVERFLOW <NOT ON OVERFLOWブロック> 4.END-UNSTRING <ブロックB> |
1.:UNSTRING文の処理,またはON OVERFLOWもしくはNOT ON OVERFLOWブロック内で解析対象に関する実行文が抽出された場合 2.:ON OVERFLOWブロック内で解析対象に関する実行文が抽出された場合 3.:NOT ON OVERFLOWブロック内で解析対象に関する実行文が抽出された場合 4.:明示範囲終了子のEND-UNSTRINGは抽出されない |
|
WRITE文 |
<ブロックA> 1.WRITE … 2.AT END-OF-PAGE <AT END-OF-PAGEブロック> 3.NOT AT END-OF-PAGE <NOT AT END-OF-PAGEブロック> 4.END-WRITE <ブロックB> |
1.:AT END-OF-PAGEまたはNOT AT END-OF-PAGEブロック内で解析対象に関する実行文が抽出された場合 2.:AT END-OF-PAGEブロック内で解析対象に関する実行文が抽出された場合 3.:NOT AT END-OF-PAGEブロック内で解析対象に関する実行文が抽出された場合 4.:明示範囲終了子のEND-WRITEは抽出されない |
|
<ブロックA> 1.WRITE … 2.INVALID KEY <ON INVALID KEYブロック> 3.NOT INVALID KEY <NOT INVALID KEYブロック> 4.END-WRITE <ブロックB> |
1.:INVALID KEYまたはNOT INVALID KEYブロック内で解析対象に関する実行文が抽出された場合 2.:INVALID KEYブロック内で解析対象に関する実行文が抽出された場合 3.:NOT INVALID KEYブロック内で解析対象に関する実行文が抽出された場合 4.:明示範囲終了子のEND-WRITEは抽出されない |
||
制御の移行が発生する構文 |
GO TO文 |
<ブロックA> 1.GO TO PARA-1. <ブロックX> … PARA-1. <ブロックY> PARA-2. <ブロックZ> <ブロックB> |
1.:GO TO文で移行した制御先のブロック内,およびそのブロックに従属するブロック内で解析対象に関する実行文が抽出された場合 |
うちPERFORM |
<ブロックA> 1.PERFORM … <ブロックX> 2.END-PERFORM. <ブロックB> |
1.:うちPERFORMによる制御下で解析対象に関する実行文が抽出された場合 2.:明示範囲終了子のEND-PERFORMは抽出されない |
|
そとPERFORM |
<ブロックA> 1.PERFORM PARA-2. PARA-1. <ブロックX> PARA-2. <ブロックY> <ブロックB> |
1.:そとPERFORMで制御の移行が発生し,その制御下で解析対象に関する実行文が抽出された場合 |
|
SORT文 |
<ブロックA> 1.SORT S-FILE ON DESCENDING KEY S-DATA 2. INPUT PROCEDURE IS INPUT-PROC 3. OUTPUT PROCEDURE IS OUTPUT-PROC. INPUT-PROC SECTION. <ブロックX> OUTPUT-PROC SECTION. <ブロックY> <ブロックB> |
1.:関連する入出力手続きで解析対象に関する実行文が抽出された場合 2.:入力手続きの制御の移行先で解析対象に関する実行文が抽出された場合 3.:出力手続きの制御の移行先で解析対象に関する実行文が抽出された場合 |
|
MERGE文 |
<ブロックA> 1.MERGE S-FILE ON DESCENDING KEY S-DATA USING IN-FILE 2. OUTPUT PROCEDURE IS OUTPUT-PROC. OUTPUT-PROC SECTION. <ブロックX> <ブロックB> |
1.:関連する入出力手続きで解析対象に関する実行文が抽出された場合 2.:出力手続きの制御の移行先で解析対象に関する実行文が抽出された場合 |
|
CONTINUE文 |
− |
実行文のCONTINUEは抽出しない |
|
USE文 |
− |
USE手続きで解析対象に関する実行文が抽出された場合 |
|
CALL文 |
<ブロックA> 1.CALL … <ブロックB> |
1.:制御の移行先で解析対象に関する実行文が抽出された場合 |
|
利用者定義関数 |
<ブロックA> 1.COMPUTE … = FUNCTION FUNC(…). <ブロックB> |
1.:制御の移行先で解析対象に関する実行文が抽出された場合 |
|
EXIT文 |
<ブロックA> 1.EXIT PROGRAM. <ブロックB> |
1.:制御の移行先で解析対象に関する実行文が抽出された場合 |
|
節・段落名 |
節 |
<ブロックA> 1.<節名> SECTION. … <ブロックB> |
1.:1.の行の節が呼び出された場合,または1.の節内で解析対象に関する実行文が抽出された場合 |
段落 |
<ブロックA> 1.<段落名>. … <ブロックB> |
1.:1.の行の段落が呼び出された場合,または1.の段落内で解析対象に関する実行文が抽出された場合 |
制御フローを考慮した解析の指定方法
cbldiaコマンドの-ControlFlowオプション,-Lineオプションおよび-Columnオプションで,実行文のデータ項目を調査対象に指定すると,実行文のデータ項目から制御フローでたどれる影響範囲に絞って解析できます。ただし,調査対象に指定できる実行文のデータ項目は,1つです。
- 注意事項
-
実行文中のCOPY文で指定する登録集定数,登録集原文名,およびその展開対象である登録集原文内部は,調査対象として指定できません。
呼び出し先プログラム内の影響2項関係の設定
呼び出し先プログラム内で,仮引数から影響を与えるデータ項目や,返却項目へ影響を与えるデータ項目の関係は,影響2項関係として抽出されません。また,ENTRY文に対しても,引数から影響を与えるデータ項目や,返却項目へ影響を与えるデータ項目の関係は,影響2項関係として抽出されません。影響波及分析の解析範囲は,呼び出し先プログラムの入口にあるデータ項目までです。
呼び出し以外でプログラムをわたる場合の設定
- 外部データ項目やGLOBAL指定のデータ項目の場合
-
制御フローを考慮した解析では,外部データ項目(EXTERNAL句)や,GLOBAL指定のデータ項目によるプログラムをわたった解析はできません。
また,解析時には,呼び出し先プログラムと異なり,プログラムをわたった直後の入口にあるデータ項目も抽出できません。例えば,次のようなプログラムで,内側プログラムの実行文「MOVE A1 TO B1」の「B1」(太字で示す)を調査対象データ項目として,影響波及元解析を実行する場合,内側プログラム内で使用している「A1」は解析対象となりますが,外側プログラムでVALUE句に指定された「A」(下線で示す)は解析対象になりません。
(例)
: WORKING-STORAGE SECTION. 01 A1 GLOBAL PIC X VALUE "A". PROCEDURE DIVISION. MOVE "S" TO A1. * --- IDENTIFICATION DIVISION. PROGRAM-ID. SUB. DATA DIVISION. WORKING-STORAGE SECTION. 01 B1 PIC X. PROCEDURE DIVISION. MOVE A1 TO B1. :
- 利用者定義関数の場合
-
制御フローを考慮した解析では,利用者定義関数によるプログラムをわたった解析はできません。
ADDRESSED句指定のデータ項目とアドレス名にアドレスが格納されたデータ項目の暗黙的影響2項関係の設定
制御フローを考慮した解析では,ADDRESSED句指定のデータ項目と,アドレス名にアドレスが格納されたデータ項目の関係は,暗黙的影響2項関係として抽出されません。
影響波及したデータ項目が,ADDRESSED句指定のデータ項目,またはアドレス名にアドレスが格納されたデータ項目である場合は,アドレスを共有する別名のデータ項目が存在することがわかるように,「アドレス別名の有無」を影響波及データ項目一覧に出力します。