我在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异常终止。
现在,我想知道我应该解析哪些其他内容才能检测内存覆盖?
答案 0 :(得分:1)
NealB有good idea。我建议您同时查看STGPROT和RENTPGM CICS system initialization parameters。
答案 1 :(得分:1)
当您使用Micro Focus COBOL时,您可以设置memory_strategy可调参数(或CBL_MEM_STRATEGY API),以通过允许运行时以各种不同方式保护内存来帮助您分析错误发生的位置。
也可以通过“CBL_MEM_VALIDATE”调用验证内存。
另一件事可以使用跟踪支持...查找CTF(Consolidated Tracing Facility)。这样可以让您了解错误时代码的位置。
一些可以帮助您的参考资料;
http://kb.microfocus.com/display/4/kb/article.aspx?aid=31645
答案 2 :(得分:1)
对于数据传递边界检查,请始终使用transclusion,它在COBOL中称为COPYCODE或COPYBOOK。在复制代码中传递根数据元素,并在调用者和被调用程序中编译相同的版本。这个COPYCODE是被调用程序的契约,所以最好有一个命名约定将它们绑在一起。要确保它们处于同步状态,每当您更改COPYCODE时,请重新编译引用它的所有程序。
此外,使用SSRANGE很棒(但有人已经提到过)。
答案 3 :(得分:0)
当CICS程序开始编写全内存时,它不仅会“停止工作”,而且可能会 也崩溃了CICS区域!
如果您确定LENGTH
和LINK
上的XCTL
设置正确且您确实
将COMMAREA
接收到该大小(EIBCALEN
)的链接记录中,那么您应该这样做
没事。
我建议您设置编译器,而不是尝试解析您的COBOL程序 边界检查选项。您遇到的问题很可能与此有关 索引或下标超出工作存储表的范围。试图检测 通过静态分析这类编程错误一般不是很多 有效。
设定界限 检查应检测超出范围内存引用,发出诊断消息 日志,然后终止您的程序 在它崩溃整个CICS区域之前。记录的消息应该指向您 发生越界参考的源线。
查看SSRANGE
编译时选项。确保它已设置并且是您的CICS区域
使用CHECK(ON)
运行LE启用的程序。
这应该超出记忆范围 引用很快。