Memory 什么会导致CICS事务从CICS分配的内存中写入?

Memory 什么会导致CICS事务从CICS分配的内存中写入?,memory,cobol,overwrite,cics,microfocus,Memory,Cobol,Overwrite,Cics,Microfocus,我在Cobol程序中使用CICS,我注意到有时数据会从CICS内存中写入。它会导致数据损坏和我的应用程序停止。我不知道它附加在哪里,所以我正在创建一个解析器来分析我的Cobol代码,以查找CICS使用的COMMAREA中可能出现的损坏。现在我检查了以下陈述: EXEC CICS XCTL EXEC CICS LINK EXEC CICS RETURN TRANSID 对于每个,我检查发送长度(在length参数中声明)是否不大于发送的COMMAREA。然后我检查接收程序中的DFHCOMMARE

我在Cobol程序中使用CICS,我注意到有时数据会从CICS内存中写入。它会导致数据损坏和我的应用程序停止。我不知道它附加在哪里,所以我正在创建一个解析器来分析我的Cobol代码,以查找CICS使用的COMMAREA中可能出现的损坏。现在我检查了以下陈述:

EXEC CICS XCTL
EXEC CICS LINK
EXEC CICS RETURN TRANSID
对于每个,我检查发送长度(在
length
参数中声明)是否不大于发送的
COMMAREA
。然后我检查接收程序中的
DFHCOMMAREA
是否大于发送的
COMMAREA
(根据本文档):

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


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

当CICS程序开始在内存上写满内容时,它不仅会“停止工作”,而且可能会停止工作 还要崩溃CICS区域

如果您确定在
链接
s和
XCTL
s上正确设置了
长度
,并且 将
COMMAREA
接收到该大小的链接记录(
EIBCALEN
)中,您应该 没事

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

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

查看
SSRANGE
编译时选项。确保已设置,并且您的CICS区域 使用
检查(打开)
运行启用LE的程序

这应该超出内存范围
引用非常快。

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

如果您确定在
链接
s和
XCTL
s上正确设置了
长度
,并且 将
COMMAREA
接收到该大小的链接记录(
EIBCALEN
)中,您应该 没事

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

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

查看
SSRANGE
编译时选项。确保已设置,并且您的CICS区域 使用
检查(打开)
运行启用LE的程序

这应该超出内存范围
引用速度非常快。

NealB有一个。我建议您也研究一下和CICS。

NealB有一个。我建议您也研究一下和CICS。

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

还可以通过“CBL_MEM_validate”调用验证内存

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

一些有助于你的参考资料


当您使用Micro Focus COBOL时,可以通过允许运行时以各种不同的方式保护内存,将内存策略设置为可调(或CBL\u内存策略API),以帮助您分析错误发生的位置

还可以通过“CBL_MEM_validate”调用验证内存

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

一些有助于你的参考资料


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


另外,SSRANGE的使用也很好(但有人已经提到了这一点)。

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