在构造控制流程图时,是否有可靠的方法或启发式来确定 COBOL 部分是否失败?

问题描述 投票:0回答:1

我正在为一些 COBOL 代码构建一个控制流程图作为练习。 对于这个问题,我考虑以下代码:

IDENTIFICATION DIVISION.PROGRAM-ID. IRREDUCIBLE-TEST.
 AUTHOR.        MOJO.
 ENVIRONMENT DIVISION.
 DATA DIVISION.
 WORKING-STORAGE SECTION.
   01  TESTING    PIC 9(8) VALUE 100.
 PROCEDURE DIVISION.
 ROOT SECTION.
   PERFORM MAIN-SECTION-01.
   STOP RUN.
 MAIN-SECTION-01 SECTION.
   MAIN-SECTION-01-A.
      IF  TESTING = 5
         GO  TO  MAIN-SECTION-01-Z.
      PERFORM  SUBROUTINE-1.
   MAIN-SECTION-01-Z.
      EXIT.
 SUBROUTINE-1 SECTION.
   SUBROUTINE-1-A.
      EXIT.

从目视检查可以清楚地看出,执行

MAIN-SECTION-01
后控制流不会失败(即,
SUBROUTINE-1
退出后不执行
MAIN-SECTION-01
),因为
MAIN-SECTION-01
是通过PERFORM调用的。 然而,不加区别地连接从句法角度来看连续的部分(如
MAIN-SECTION-01
SUBROUTINE-1
)会导致不可约的流程图(使用 T1-T2 变换),如下所示:

不可简化的流程图导致串行部分不加区别地链接

我的问题是:是否有合理的启发式或图论基础来明确确定一个部分是否不属于下一个部分?我知道,由于基于计算条件的决策,总会存在没有明确是/否答案的情况,但在没有歧义的情况下(如上面的程序),合理的方法是什么?

我非常感谢任何有关我可以自己探索的相关技术的指示。

我规避此问题的一种方法是让开发人员明确指定哪些部分/段落没有传入的失败连接。这可行,但我更乐意自动化(某些)决策。

graph-theory cobol heuristics control-flow-graph fall-through
1个回答
0
投票

如果您“落入”某个部分或“转到”某个部分,则代码将落入下一个段落或部分。

基本上,除非您“执行”一个部分,否则不会发生隐式退出,并且控制权会落到下一段。

© www.soinside.com 2019 - 2024. All rights reserved.