构建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
相关产品推荐
相关产品推荐

