一個簡單的例子而已。
IDENTIFICATION DIVISION.
PROGRAM-ID.
AMBCDBTD
.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-9000.
OBJECT-COMPUTER. IBM-9000.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
DATA DIVISION.
FILE SECTION.
….
WORKING-STORAGE SECTION.
01 NAME-TABLE.
03 WK-NAME OCCURS 3 TIMES.
05 FNAME PIC X(12).
05 LNAME PIC X(12).
01 WK-INDEX PIC 9(1).
…..
/*很明顯索引越界
PERFORM VARYING WK-INDEX FROM 1 BY 1 UNTIL WK-INDEX > 4
MOVE 'LEYOND' TO FNAME(WK-INDEX)(1:6)
MOVE WK-INDEX TO FNAME(WK-INDEX)(7:1)
MOVE 'LIN' TO LNAME(WK-INDEX)(1:3)
MOVE WK-INDEX TO LNAME(WK-INDEX)(4:1)
END-PERFORM.
接下來寫一個簡單的JOB:
//AMBCDBTD EXEC PGM=
AMBCDBTD
//SYSOUTPT INCLUDE MEMBER=SYSOUTPT
The reference to table WK-NAME by verb number 01 on line 000140 address an area outside the region of the table, From compile unit AMBCDBTD at entry point AMBCDBTD at compile unit offset +0000073C at entry offset +0000073C at address 16F01054.
這里我們看到信息中的offset,它告訴錯位位置在程序AMBCDBTD中的偏移量,那么我們找到剛才編譯AMBCDBTD的信息,搜索073c,找到結果如下:
000140 MOVE
000704 F270 D108 8058 PACK 264(8,13),88(1,8)
000738 4110 A2B2 LA 1,690(0,10)
00073C 0DEF BASR 14,15
說明MOVE語句出現了問題,我們繼續查找看看是哪行出問題了,找到MOVE左邊的000140,搜索得到:
000140 1 MOVE ‘LEYOND’ TO FNAME(WK-INDEX)(1:6)
這樣的話比較清楚了,很容易能察覺到wk-index超出了FNAME表的界限。