Hitachi

COBOL2002 Professional Tool Kit データ影響波及分析ガイド


12.7.2 制御ブロックの解析方針

制御フローを考慮した解析では,制御フローをたどりながら解析します。

制御フローの記述順序に従って,文から文へと制御を移行して,ほかへ制御を移行しない範囲を制御ブロックといいます。そのため,制御フローを考慮した解析では,制御ブロック中の文は記述順序のとおりに実行されるものとして扱います。

制御ブロックの移行

制御ブロック間で制御の移行が発生する文があります。制御の移行が発生する文を次に示します。

表12‒12 制御ブロック間で制御の移行が発生する文

分類

制御の移行が発生する文

制御の明示移行

手続き分岐文

  • CONTINUE文

  • GO TO文

  • PERFORM文

条件文

  • EVALUATE文

  • IF文

制御の暗黙移行

  • MERGE文

  • PERFORM文

  • SORT文

  • USE文

プログラム制御

  • CALL文

  • EXIT文

  • 利用者定義関数

制御フローを考慮した解析では,プログラムの制御は,外部プログラムまたは内部プログラムをわたって,そのプログラムの引数まで解析します。

制御の移行が発生する文ごとに,制御の移行について説明します。

PERFORM文によるループ区間の解析

制御フローを考慮した解析では,PERFORM文によるループ区間の途中から解析をする場合は,次のように解析します。

影響波及先解析の場合の例を次に示します。

(例)「Move A TO B」の「A」が解析の基点で,影響波及先解析の場合の例

[図データ]

この例では,次のように解析します。

  1. 解析の基点となる実行文(MOVE A TO B)から,ループ区間の終了(MOVE B TO C)までを解析します。

  2. ループ区間の開始(MOVE C TO D)から,解析の基点となる実行文の直前(MOVE D TO E)までを解析します。

  3. ループ区間の終了(DISPLAY A.)以降を解析します。

選択可能な条件指定ができる手続き文の対応

手続き文には,選択可能な条件が指定できる手続き文があります。選択可能な条件指定ができる手続き文の場合,制御フローを考慮した解析では,次の表に示すように対応します。

注意事項

実行文の条件を評価した結果,コンパイラで不要と判断された条件指定が削除される旨のメッセージが表示されることがあります。制御フローを考慮した解析では,COBOLソースファイル中のソースコードがそのまま解析されます。

表12‒13 条件指定可能な手続き文の対応

コード例

制御フローを考慮した解析での対応

解析時に想定する制御フロー

ACCEPT文

<ブロックA>
ACCEPT …
ON EXCEPTION
  <ON EXCEPTIONブロック>
NOT ON EXCEPTION
  <NOT ON EXCEPTIONブロック>
END-ACCEPT
<ブロックB>

ON EXCEPTIONのブロックに移行する場合の制御フロー(1.)と,ACCEPT文の処理からNOT ON EXCEPTIONのブロックに移行する場合の制御フロー(2.)の両方を想定して解析します。

  1. <ブロックA> → <ON EXCEPTIONブロック> → <ブロックB>

  2. <ブロックA> → <ACCEPT文の処理> → <NOT ON EXCEPTIONブロック> → <ブロックB>

ADD文

<ブロックA>
ADD … TO …
ON SIZE ERROR
  <ON SIZE ERRORブロック>
NOT ON SIZE ERROR
  <NOT ON SIZE ERRORブロック>
END-ADD
<ブロックB>

ON SIZE ERRORのブロックに移行する場合の制御フロー(1.)と,ADD文の処理からNOT ON SIZE ERRORのブロックに移行する場合の制御フロー(2.)の両方を想定して解析します。

  1. <ブロックA> → <ON SIZE ERRORブロック> → <ブロックB>

  2. <ブロックA> → <ADD文の処理> → <NOT ON SIZE ERRORブロック> → <ブロックB>

CALL文

<ブロックA>
CALL …
ON EXCEPTION
  <ON EXCEPTIONブロック>
NOT ON EXCEPTION
  <NOT ON EXCEPTIONブロック>
END-CALL
<ブロックB>

ON EXCEPTIONのブロックに移行する場合の制御フロー(1.)と,CALL文の処理からNOT ON EXCEPTIONのブロックに移行する場合の制御フロー(2.)の両方を想定して解析します。

  1. <ブロックA> → <ON EXCEPTIONブロック> → <ブロックB>

  2. <ブロックA> → <CALL文の処理> → <NOT ON EXCEPTIONブロック> → <ブロックB>

<ブロックA>
CALL …
ON OVERFLOW
  <ON OVERFLOWブロック>
END-CALL
<ブロックB>

CALL文の制御フロー(1.)と,ON OVERFLOWのブロックに移行する場合の制御フロー(2.)の両方を想定して解析します。

  1. <ブロックA> → <CALL文の処理> → <ブロックB>

  2. <ブロックA> → <ON OVERFLOWブロック> → <ブロックB>

COMPUTE文

<ブロックA>
COMPUTE … = …
ON SIZE ERROR
  <ON SIZE ERRORブロック>
NOT ON SIZE ERROR
  <NOT ON SIZE ERRORブロック>
END-COMPUTE
<ブロックB>

ON SIZE ERRORのブロックに移行する場合の制御フロー(1.)と,COMPUTE文の処理からNOT ON SIZE ERRORのブロックに移行する場合の制御フロー(2.)の両方を想定して解析します。

  1. <ブロックA> → <ON SIZE ERRORブロック> → <ブロックB>

  2. <ブロックA> → <COMPUTE文の処理> → <NOT ON SIZE ERRORブロック> → <ブロックB>

DELETE文

<ブロックA>
DELETE … RECORD
INVALID KEY
  <ON INVALID KEYブロック>
NOT INVALID KEY
  <NOT INVALID KEYブロック>
END-DELETE
<ブロックB>

ON INVALID KEYのブロックに移行する場合の制御フロー(1.)ともNOT ON INVALID KEYのブロックに移行する場合の制御フロー(2.)の両方を想定して解析します。

  1. <ブロックA> → <ON INVALID KEYブロック> → <ブロックB>

  2. <ブロックA> → <NOT ON INVALID KEYブロック> → <ブロックB>

DISPLAY文

<ブロックA>
DISPLAY … UPON …
ON EXCEPTION
  <ON EXCEPTIONブロック>
NOT ON EXCEPTION
  <NOT ON EXCEPTIONブロック>
END-DISPLAY
<ブロックB>

ON EXCEPTIONのブロックに移行する場合の制御フロー(1.)と,DISPLAY文の処理からNOT ON EXCEPTIONのブロックに移行する場合の制御フロー(2.)の両方を想定して解析します。

  1. <ブロックA> → <ON EXCEPTIONブロック> → <ブロックB>

  2. <ブロックA> → <DISPLAY文の処理> → <NOT ON EXCEPTIONブロック> → <ブロックB>

DIVIDE文

<ブロックA>
DIVIDE … INTO …
ON SIZE ERROR
  <ON SIZE ERRORブロック>
NOT ON SIZE ERROR
  <NOT ON SIZE ERRORブロック>
END-DIVIDE
<ブロックB>

ON SIZE ERRORのブロックに移行する場合の制御フロー(1.)と,DIVIDE文の処理からNOT ON SIZE ERRORのブロックに移行する場合の制御フロー(2.)の両方を想定して解析します。

  1. <ブロックA> → <ON SIZE ERRORブロック> → <ブロックB>

  2. <ブロックA> → <DIVIDE文の処理> → <NOT ON SIZE ERRORブロック> → <ブロックB>

EVALUATE文

<ブロックA>
EVALUATE …
WHEN …
  <WHENブロック1>
:
WHEN …
  <WHENブロックN>
:
WHEN OTHER
  <WHEN OTHERブロック>
END-EVALUATE
<ブロックB>

それぞれのWHENのブロックに移行する場合の制御フロー(1.および2.)と,WHEN OTHERのブロックに移行する場合の制御フロー(3.)のそれぞれを想定して解析します。

  1. <ブロックA> → <WHENブロック1> → <ブロックB>

  2. <ブロックA> → <WHENブロックN> → <ブロックB>

  3. <ブロックA> → <WHEN OTHERブロック> → <ブロックB>

IF文

<ブロックA>
IF <判定文> THEN
  <THENのブロック>
ELSE
  <ELSEのブロック>
END-IF
<ブロックB>

THENのブロックに移行する場合の制御フロー(1.)と,ELSEのブロックに移行する場合の制御フロー(2.)の両方を想定して解析します。

  1. <ブロックA> → <THENブロック> → <ブロックB>

  2. <ブロックA> → <ELSEブロック> → <ブロックB>

MULTIPLY文

<ブロックA>
MULTIPLY … BY …
ON SIZE ERROR
  <ON SIZE ERRORブロック>
NOT ON SIZE ERROR
  <NOT ON SIZE ERRORブロック>
END-MULTIPLY
<ブロックB>

ON SIZE ERRORのブロックに移行する場合の制御フロー(1.)と,MULTIPLY文の処理からNOT ON SIZE ERRORのブロックに移行する場合の制御フロー(2.)の両方を想定して解析します。

  1. <ブロックA> → <ON SIZE ERRORブロック> → <ブロックB>

  2. <ブロックA> → <MULTIPLY文の処理> → <NOT ON SIZE ERRORブロック> → <ブロックB>

READ文

<ブロックA>
READ … RECORD …
AT END
  <AT ENDブロック>
NOT AT END
  <NOT AT ENDブロック>
END-READ
<ブロックB>

READ文の処理からAT ENDのブロックに移行する場合の制御フロー(1.)と,READ文の処理からNOT AT ENDのブロックに移行する場合の制御フロー(2.)の両方を想定して解析します。

  1. <ブロックA> → <READ文の処理> → <AT ENDブロック> → <ブロックB>

  2. <ブロックA> → <READ文の処理> → <NOT AT ENDブロック> → <ブロックB>

RETURN文

<ブロックA>
RETURN … RECORD …
AT END
  <AT ENDブロック>
NOT AT END
  <NOT AT ENDブロック>
END-RETURN
<ブロックB>

RETURN文の処理からAT ENDのブロックに移行する場合の制御フロー(1.)と,RETURN文の処理からNOT AT ENDのブロックに移行する場合の制御フロー(2.)の両方を想定して解析します。

  1. <ブロックA> → <RETURN文の処理> → <AT ENDブロック> → <ブロックB>

  2. <ブロックA> → <RETURN文の処理> → <NOT AT ENDブロック> → <ブロックB>

REWRITE文

<ブロックA>
REWRITE …
INVALID KEY
  <ON INVALID KEYブロック>
NOT INVALID KEY
  <NOT INVALID KEYブロック>
END-REWRITE
<ブロックB>

ON INVALID KEYのブロックに移行する場合の制御フロー(1.)と,NOT ON INVALID KEYのブロックに移行する場合の制御フロー(2.)の両方を想定して解析します。

  1. <ブロックA> → <ON INVALID KEYブロック> → <ブロックB>

  2. <ブロックA> → <NOT ON INVALID KEYブロック> → <ブロックB>

SEARCH文

<ブロックA>
SEARCH …
AT END
  <AT ENDブロック>
WHEN
  <WHENブロック>
END-SEARCH
<ブロックB>

SEARCH文の処理からAT ENDのブロックに移行する場合の制御フロー(1.)と,SEARCH文の処理からWHENのブロックに移行する場合の制御フロー(2.)の両方を想定して解析します。

  1. <ブロックA> → <SEARCH文の処理> → <AT ENDブロック> → <ブロックB>

  2. <ブロックA> → <SEARCH文の処理> → <WHENブロック> → <ブロックB>

START文

<ブロックA>
START …
INVALID KEY
  <ON INVALID KEYブロック>
NOT INVALID KEY
  <NOT INVALID KEYブロック>
END-START
<ブロックB>

ON INVALID KEYのブロックに移行する場合の制御フロー(1.)と,NOT ON INVALID KEYのブロックに移行する場合の制御フロー(2.)の両方を想定して解析します。

  1. <ブロックA> → <ON INVALID KEYブロック> → <ブロックB>

  2. <ブロックA> → <NOT ON INVALID KEYブロック> → <ブロックB>

STRING文

<ブロックA>
STRING …
ON OVERFLOW
  <ON OVERFLOWブロック>
NOT ON OVERFLOW
  <NOT ON OVERFLOWブロック>
END-STRING
<ブロックB>

ON OVERFLOWのブロックに移行する場合の制御フロー(1.)と,STRING文の処理からNOT ON OVERFLOWのブロックに移行する場合の制御フロー(2.)の両方を想定して解析します。

  1. <ブロックA> → <ON OVERFLOWブロック> → <ブロックB>

  2. <ブロックA> → <STRING文の処理> → <NOT ON OVERFLOWブロック> → <ブロックB>

SUBTRACT文

<ブロックA>
SUBTRACT … FROM …
ON SIZE ERROR
  <ON SIZE ERRORブロック>
NOT ON SIZE ERROR
  <NOT ON SIZE ERRORブロック>
END-SUBTRACT
<ブロックB>

ON SIZE ERRORのブロックに移行する場合の制御フロー(1.)と,SUBTRACT文の処理からNOT ON SIZE ERRORのブロックに移行する場合の制御フロー(2.)の両方を想定して解析します。

  1. <ブロックA> → <ON SIZE ERRORブロック> → <ブロックB>

  2. <ブロックA> → <SUBTRACT文の処理> → <NOT ON SIZE ERRORブロック> → <ブロックB>

UNSTRING文

<ブロックA>
UNSTRING …
ON OVERFLOW
  <ON OVERFLOWブロック>
NOT ON OVERFLOW
  <NOT ON OVERFLOWブロック>
END-UNSTRING
<ブロックB>

ON OVERFLOWのブロックに移行する場合の制御フロー(1.)と,UNSTRING文の処理からNOT ON OVERFLOWのブロックに移行する場合の制御フロー(2.)の両方を想定して解析します。

  1. <ブロックA> → <ON OVERFLOWブロック> → <ブロックB>

  2. <ブロックA> → <UNSTRING文の処理> → <NOT ON OVERFLOWブロック> → <ブロックB>

WRITE文

<ブロックA>
WRITE …
AT END-OF-PAGE
  <AT END-OF-PAGEブロック>
NOT AT END-OF-PAGE
  <NOT AT END-OF-PAGEブロック>
END-WRITE
<ブロックB>

WRITE文の処理からAT END-OF-PAGEのブロックに移行する場合の制御フロー(1.)と,WRITE文の処理からNOT AT END-OF-PAGEのブロックに移行する場合の制御フロー(2.)の両方を想定して解析します。

  1. <ブロックA> → <WRITE文の処理> → <AT END-OF-PAGEブロック> → <ブロックB>

  2. <ブロックA> → <WRITE文の処理> → <NOT AT END-OF-PAGEブロック> → <ブロックB>

<ブロックA>
WRITE …
INVALID KEY
  <ON INVALID KEYブロック>
NOT INVALID KEY
  <NOT INVALID KEYブロック>
END-WRITE
<ブロックB>

ON INVALID KEYのブロックに移行する場合の制御フロー(1.)と,NOT ON INVALID KEYのブロックに移行する場合の制御フロー(2.)の両方を想定して解析します。

  1. <ブロックA> → <ON INVALID KEYブロック> → <ブロックB>

  2. <ブロックA> → <NOT ON INVALID KEYブロック> → <ブロックB>