You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

构建COBOL控制流图时,如何判断段落是否无贯穿跳转?

COBOL控制流图中SECTION贯穿性的自动化判断问题

示例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被PERFORM调用,执行完毕后控制流会返回到PERFORM的下一句(即STOP RUN),不会贯穿到后续的SUBROUTINE-1。但如果盲目按语法顺序连接连续SECTION,会生成经T1-T2变换后仍无法简化的不可约流图。

当前只能靠开发者手动指定无贯穿连接的段落/SECTION,希望在无歧义场景下实现部分决策自动化,核心需求是:

  • 无歧义场景中,有哪些合理的启发式或图论依据能判断某个SECTION不会贯穿到下一个SECTION?
  • 有哪些技术方向可深入研究以解决该问题?

无歧义场景下的判断方法

启发式规则

  • 被PERFORM调用且出口明确的SECTION:如果SECTION的所有执行路径最终都以明确终止自身的语句结束(比如EXIT SECTION/EXIT PARAGRAPH、跳转到自身内部的EXIT节点,或SECTION末尾无额外语句默认触发EXIT),则该SECTION执行后会直接返回到PERFORM的下一句,不会贯穿到后续SECTION。示例中的MAIN-SECTION-01就是典型:无论是否触发IF分支,最终都会走到MAIN-SECTION-01-Z的EXIT,因此不会跳到SUBROUTINE-1。
  • 含终止程序/模块语句的SECTION:若SECTION内存在STOP RUN、EXIT PROGRAM、CANCEL等直接终止程序或模块执行的语句,执行到这类语句后程序直接结束,不存在贯穿到后续SECTION的可能。
  • 所有路径均指向非后续节点的SECTION:若SECTION内所有可能的执行路径,最终都通过GO TO跳转到了非相邻的SECTION/段落,没有路径会自然流到SECTION末尾,则该SECTION不会贯穿到下一个SECTION。

图论相关依据

  • 支配节点分析:计算控制流图的支配树,若某个SECTION的入口节点的后继节点中,PERFORM调用点的下一个语句是其支配节点(即执行完SECTION后必须回到该点),则可判定该SECTION不会贯穿到后续SECTION。
  • 不可约流图验证:若盲目连接生成的流图存在不可约循环(无法通过T1-T2变换消除的循环结构),则说明之前的贯穿连接是错误的。不过这属于事后验证,效率不如前置判断,但可作为结果校验手段。

研究指引

  • 深入掌握COBOL执行模型:重点研究PROCEDURE DIVISION中PERFORM的全量调用规则、EXIT语句的语义、控制流转移的优先级,这是准确判断控制流的基础。
  • 学习编译器控制流分析技术:系统学习基本块划分、数据流分析、支配树计算、循环检测等编译器构造核心技术,这些是自动化构建控制流图的理论支撑。
  • 研究不可约流图理论:了解T1-T2变换的定义、不可约流图的特征与判定方法,帮助快速识别错误的流图连接方式,优化判断逻辑。

内容的提问来源于stack exchange,提问作者Etten Moor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 15:00:00