免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9036 | 回复: 2
打印 上一主题 下一主题

AS400指针的一些测试 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-11-22 13:01 |只看该作者 |倒序浏览
测试1:
PGMA:

  *Get random function
DJava_Random          Pr                             8F
D                                                                          Extproc(*Java:
D                                                                           'java.lang.Math':
D                                                                           'random')
D                                                                           Static
Ds_52S52                  S                            52S52
Df_8F                        S                             8F
Din_Ptr1                    S                               *
/Free
        // call java function
        f_8F = Java_random();
        s_52S52 = f_8F ;   //记录下s_52S52的值
        in_Ptr1  = %Addr(s_52S52) ;    // Debug程序至此时,记录下in_Ptr1的地址值例如:C33E1565CB002703
        Dsply s_52S52 ;
        *Inlr = *On ;
        Return ;

/End-Free


PGMB:

*
DDs_Ds                      Ds      
Dc_A30                                                     30A
Ds_30S0                                                   30S 0 OverLay(c_A30)

DDs_Ds_1                  Ds
Dc_A52_1                                                 52A    Inz
Ds_52S52_1                                             52S52 OverLay(c_A52_1)

Dc_A52_3                  S                             52A   Based(in_Ptr3)
Dc_str                       S                               1A   Inz
Dc_Flag                     S                               1A
Dc_Par1                    S                              30A
Din_Ptr1                    S                                 *   Inz(*Null)
Din_ptr2                    S                                 *   Inz(*Null)
Din_ptr3                    S                                 *   Inz(*Null)

C        *Entry              PList
C                               Parm                              c_Flag
C                               Parm                              c_Par1
  /Free
        // Get pgm Addr
        in_Ptr1 = %Addr(c_Str) ;  // 第一次CALL PGMB,记录下in_Ptr1的地址值例如:C33E1565CB064148
        If c_Flag = '' ;   //第一次调用仅获取地址,不执行其他逻辑
           *Inlr =*On ;
            Retrurn ;
        EndIf ;
        in_Ptr2 = in_Ptr1 ; // Backup
        
        c_A30 = c_Par1 ;
        If c_Flag = '1' ;  //正负转换
           s_30S0 = 0-s_30S0 ;
        EndIf ;
        
         // Move Pointer
         in_Ptr3 = in_Ptr2 - s_S30S0 ;
         
        // Dsply c_A52_3
        // Get PgmA Value
        c_A52_1 = %Str(in_Ptr3:52) ;  // 第二次CALL PGMB时 ,s_52S52_1的值为PGMA.s_52S52
        Dsply s_52S52_1 ;
        
        *Inlr =*On ;
        Retrurn ;
  /End-Free

测试步骤:
      1)Debug PGMA ,记录下PGMA的in_Ptr1的地址。
      2)Call PGMB ('' '000000000000000000000000000000‘)Debug PGMB,记录下PGMB的in_Ptr1的地址。
      3)计算PGMB的in_Ptr1的地址与PGMA的in_Ptr1的地址的差值,比如例子中为61A45(399941)=C33E1565CB064148-C33E1565CB002703
      4)重新CALL PGMB ('0' '000000000000000000000000399941‘)

结果:第二次CALL PGMB时 ,s_52S52_1的值为PGMA.s_52S52



测试2
PGM1
Dc_Str                  S                     1A
      DlyJOB 10秒
     循环判断c_Str否为指定值'A'
         DlyJOB 10秒
     结束循环

PGM2
Din_Ptr                S                        *
       通过特殊方式设置in_Ptr指向c_Str的内存地址。
       通过%Str(in_Ptr:1) = 'A'来修改内存的值

结果:即通过PGM2的的指针移动,可以执行PGM1的运行中的变量的内存区域,并修改该内存区域值,来达到修改PGM1的运行逻辑的效果。

以上测试必须在同一个Session,且PGMA与PGMB程序运行时间差不大情况下才有效果。

以上测试能证实一些东西:
1)程序运行结束后,所分配的内存并不会立即清空,只要未被重新分配使用,内存区域的值仍然存在,即可通过指针的移动获取到先前程序的运行数据。
2)程序启动时,变量对应内存区域如不通过%ALLOC或%REALLOC函数重新分分配,在短期内重复调用时,分配时是始终是同一块内存区域,即PGMA在第一调用时,变量A的内存地址是FFFF,如程序内无重新分配内存地址操作,则再程序结束后,后续短期内重复调用时,内存地址是固定的(这也就是第一个测试能做的原因之一)
3)程序内指针的移动应该是有范围限制(MSG:MCH0601),可能与激活组有关。

以上内容仅根据结果的推论,具体缘由望大神们指教。

论坛徽章:
0
2 [报告]
发表于 2013-11-22 13:45 |只看该作者
不会开发。

论坛徽章:
0
3 [报告]
发表于 2013-11-27 15:07 |只看该作者
不错,支持一下!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP