变量作为对程序的引用传递的最可能的原因是它的值是否会超过其长度?

时间:2017-08-09 22:06:49

标签: pointers ibm-midrange rpgle

我的同事昨天来找我一个问题。

他有一个定义了两个变量的CL,每个变量10个字符。然后他用第一个变量作为参数调用另一个CL,并且在CL返回之后(这是一个很长的程序串,很可能必须手动梳理出有问题的代码),他的第一个变量没有改变,但是他的第二个变量的前5个字符被删除。

因为参数是通过引用传递的,所以显然有些东西能够影响超过分配的10个字节,并且它会溢出到内存中紧跟其后定义的变量,但是我想知道这个的常见例子是什么是(这不会导致某种明显的错误)。获取此地址的另一个程序传递给它,其参数定义为15个字节?使用指向地址的指针然后解除引用并分配15个字符的字符串?这是V7R1。

与此同时,他在两者之间插入另一个变量作为缓冲区lol。有趣的是,未分配值的变量永远不会被初始化,因此它们在内存中没有任何空间。在玩这个游戏时要发现有趣的事情。

3 个答案:

答案 0 :(得分:3)

所有需要的是调用堆栈中的程序进一步向下以使参数定义错误

调用程序

getVPDetails("2132").then((rs: PlanInfo) => {
    // here you will have your `rs`
});

// Function Definition
async getVPDetails(pid): Promise<PlanInfo> {
    return await this.vpService.getPlansInfo({plan_id: pid});
}

// Middle Ware
getPlansInfo(data): Promise<PlanInfo> {
    return this.http.post('/vehicle-plan/plan-info', data)
          .map(res => res.json())
          .toPromise();
}

调用程序

/*pgm a*/
pgm
  dcl &parm1 char(10) value('Hello')
  dcl &parm2 char(10) value('Charles')

  call pgmb parm(&parm1 &parm2)
endpgm

注意:它不能保证中断,它可能正常工作,直到应用一些改变操作系统内部或编译器的PTF。

我个人看到RPG III程序多年来一直处于“正常”的状态,由于编译器如何布局内存的不同而在转换为RPGIV时中断了。 RPG III程序破坏了未使用的内存,但在RPGIV中,损坏的内存非常重要。

最重要的是,自己很幸运,错误被抛出......追踪调用堆栈以找出不匹配。

答案 1 :(得分:1)

在两个变量之间定义另一个变量并不一定会产生影响。无法保证变量按存储顺序在程序中定义。

为确保变量后面有额外的存储空间,必须明确定义额外的存储空间。

在CL中,这样做。这将在&amp; MYVAR之后添加一个保证额外的90个字节。

dcl &myvar_stg type(*char) len(100)                                 
   dcl &myvar type(*char) stg(*defined) len(10) defvar(&myvar_stg 1)

答案 2 :(得分:0)

假设所涉及的所有程序都是可调试的,您可以通过在调试中监视第二个变量来确切地了解存储被破坏的位置。

在调试器中,使用“watch”命令,然后让程序运行。

===> watch &myvar2

您将在更改存储的语句之后的下一个debuggable语句上获得监视断点。通常,下一个debuggable语句位于更改存储的同一程序中。