0

我在 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):

接收数据区不必与原始通信区长度相同;如果只需要访问数据的第一部分,则新数据区可以更短。但是,它不能长于通过的通信区域的长度。如果是这样,您的事务可能会无意中尝试读取已传递区域之外的数据。它还可能覆盖该区域之外的数据,这可能导致 CI​​CS 异常终止。

现在,我想知道为了检测内存覆盖,我应该解析哪些其他内容?

4

4 回答 4

1

NealB 有一个好主意。我建议您还查看STGPROTRENTPGM CICS系统初始化参数

于 2012-01-26T01:25:36.217 回答
1

当您使用 Micro Focus COBOL 时,您可以设置 memory_strategy 可调参数(或 CBL_MEM_STRATEGY API),通过允许运行时以各种不同的方式保护内存来帮助您分析错误发生的位置。

内存也可以通过“CBL_MEM_VALIDATE”调用来验证。

可以做的另一件事是使用跟踪支持...查找 CTF(综合跟踪工具)。这将使您了解发生错误时代码的位置。

一些对您有帮助的参考资料;

http://kb.microfocus.com/display/4/kb/article.aspx?aid=31645

http://documentation.microfocus.com/help/index.jsp?topic=%2Fcom.microfocus.eclipse.infocenter.studee60win.sp02ws01%2FHRRTRHRTCF0O.html

http://documentation.microfocus.com/help/index.jsp?topic=%2Fcom.microfocus.eclipse.infocenter.studee60ux.sp02ws01%2FGUID-762085AC-8396-4D71-9CC1-6231551D3AEE.html

于 2012-02-10T13:14:08.877 回答
1

对于数据传递边界检查,始终使用transclusion,在 COBOL 中称为 COPYCODE 或 COPYBOOK。在复制代码中传递根数据元素,并在调用者和被调用程序中编译相同的版本。这个 COPYCODE 是被调用程序的一种约定,所以最好有一个命名约定将它们联系在一起。为确保它们同步,无论何时更改 COPYCODE,都要重新编译所有引用它的程序。

此外,SSRANGE 的使用很棒(但有人已经提到过)。

于 2012-04-06T14:42:01.783 回答
0

当 CICS 程序开始在内存中写入时,它不仅会“停止工作”,而且还可能使 CICS 区域崩溃!

如果您确定在s 和sLENGTH上正确设置了并且您正在接收到该大小的链接记录 ( ),那么您应该没问题。LINKXCTLCOMMAREAEIBCALEN

我建议您设置编译器边界检查选项,而不是尝试解析您的 COBOL 程序。您遇到的问题很可能与超出工作存储表范围的索引或下标有关。试图通过静态分析来检测这类编程错误通常不是很有效。

设置边界检查应该检测超出范围的内存引用,向日志发出诊断消息,然后在程序崩溃整个 CICS 区域之前终止程序。记录的消息应该指向发生越界引用的源行。

检查SSRANGE编译时选项。确保它已设置并且您的 CICS 区域使用CHECK(ON).

这应该很快就能确定内存引用越界。

于 2012-01-25T17:58:37.333 回答