【发布时间】:2012-02-18 18:41:09
【问题描述】:
我在 Cobol 程序中使用 CICS,我注意到有时数据会从 CICS 内存中写入。它会导致数据损坏并且我的应用程序停止。我不知道它附加在哪里,所以我正在创建一个解析器来分析我的 Cobol 代码,以查找 CICS 使用的 COMMAREA 中可能存在的损坏。现在我检查了以下陈述:
EXEC CICS XCTL
EXEC CICS LINK
EXEC CICS RETURN TRANSID
对于每个,我检查发送的长度(在LENGTH 参数中声明)是否不大于发送的COMMAREA。然后我检查DFHCOMMAREA,在接收程序中是否大于发送COMMAREA(根据这个文档http://publib.boulder.ibm.com/infocenter/cicsts/v3r1/index.jsp?topic=%2Fcom.ibm.cics.ts31.doc%2Fdfhp3%2Fdfhp37t.htm):
接收数据区不必与原始通信区长度相同;如果只需要访问数据的第一部分,则新数据区可以更短。但是,它不能长于通过的通信区域的长度。如果是这样,您的事务可能会无意中尝试读取已传递区域之外的数据。它还可能覆盖区域外的数据,这可能导致 CICS 异常终止。
现在,我想知道我应该解析哪些其他内容以检测内存覆盖?
【问题讨论】:
-
编写一个健壮的 COBOL 解析器是一项艰巨的工作。如果您使用的是 IBM Enterprise COBOL,我建议您探索使用编译器 ADATA 选项来生成 AST 并从那里开始。检测边界错误所需的静态代码分析类型在技术上不可能完全正确。静态分析基于程序的句法结构,而不是程序的语义,因此几乎不可能确定实际的运行时行为。
-
不幸的是,我正在使用 Microfocus NetExpress 编译器。而且,事实上,在静态分析中很难确定语义。实际上,我正在尝试找出可以在代码中完成的所有“路径”,并确定其中一些是否会产生错误。
标签: memory cobol overwrite cics microfocus