COBOL奇偶判断程序报错求助:SIGSEGV内存引用错误
COBOL奇偶判断程序内存错误排查
问题场景
编写了一个COBOL程序用于判断数字奇偶性,运行时触发以下错误:
attempt to reference unallocated memory (signal SIGSEGV) Last statement of EVEN-OR-ODD unknown Last statement of TESTS unknown
原程序代码:
IDENTIFICATION DIVISION. PROGRAM-ID. EVEN-OR-ODD. DATA DIVISION. LINKAGE SECTION. 01 NUM PIC S9(08). 01 R PIC S9(08). 01 Q PIC S9(08). 01 RESULT PIC A(04). PROCEDURE DIVISION USING NUM. DIVIDE NUM BY 2 GIVING R REMAINDER Q. IF Q IS NOT EQUAL TO 0 MOVE "ODD" TO RESULT ELSE MOVE "EVEN" TO RESULT STOP RUN. END PROGRAM EVEN-OR-ODD.
测试用例代码:
IDENTIFICATION DIVISION. PROGRAM-ID. TESTS. DATA DIVISION. WORKING-STORAGE SECTION. 01 NUM PIC S9(8). 01 RESULT PIC A(4). PROCEDURE DIVISION. TESTSUITE 'Fixed tests'. TESTCASE 'Test 01'. MOVE 0 TO NUM INITIALIZE RESULT CALL 'EVEN-OR-ODD' USING BY CONTENT NUM BY REFERENCE RESULT EXPECT RESULT TO BE "Even". TESTCASE 'Test 02'. MOVE 1 TO NUM INITIALIZE RESULT CALL 'EVEN-OR-ODD' USING BY CONTENT NUM BY REFERENCE RESULT EXPECT RESULT TO BE "Odd". TESTCASE 'Test 03'. MOVE 7 TO NUM INITIALIZE RESULT CALL 'EVEN-OR-ODD' USING BY CONTENT NUM BY REFERENCE RESULT EXPECT RESULT TO BE "Odd". TESTCASE 'Test 04'. MOVE -42 TO NUM INITIALIZE RESULT CALL 'EVEN-OR-ODD' USING BY CONTENT NUM BY REFERENCE RESULT EXPECT RESULT TO BE "Even". TESTCASE 'Test 05'. MOVE -17 TO NUM INITIALIZE RESULT CALL 'EVEN-OR-ODD' USING BY CONTENT NUM BY REFERENCE RESULT EXPECT RESULT TO BE "Odd". END TESTS. END PROGRAM TESTS.
错误原因分析
- 调用参数不匹配:测试用例调用
EVEN-OR-ODD时传入了NUM和RESULT两个参数,但被调用程序的PROCEDURE DIVISION仅声明USING NUM,未包含RESULT。这导致RESULT的内存地址未被正确关联,程序访问RESULT时触发未分配内存引用错误。 - LINKAGE SECTION滥用:
R和Q是计算临时变量,不属于外部传入参数,不应放在LINKAGE SECTION中。该段仅用于接收外部传入的数据,未关联外部内存的变量会导致未分配内存访问。 - IF语句缺少闭合:多行IF语句未使用
END IF闭合,导致COBOL编译器无法正确识别程序逻辑边界,出现Last statement unknown提示。 - 终止语句错误:被调用程序使用
STOP RUN会直接终止整个程序,而非返回调用者,导致测试用例后续逻辑无法执行,同时引发程序异常。应使用EXIT PROGRAM返回。 - 字符串大小写不匹配:程序中返回的是大写的
"EVEN"/"ODD",但测试用例期望的是首字母大写的"Even"/"Odd",会导致测试断言失败。
修正后的程序代码
修正后的EVEN-OR-ODD程序
IDENTIFICATION DIVISION. PROGRAM-ID. EVEN-OR-ODD. DATA DIVISION. WORKING-STORAGE SECTION. 01 R PIC S9(08). 01 Q PIC S9(08). LINKAGE SECTION. 01 NUM PIC S9(08). 01 RESULT PIC A(04). PROCEDURE DIVISION USING NUM, RESULT. DIVIDE NUM BY 2 GIVING R REMAINDER Q. IF Q IS NOT EQUAL TO 0 MOVE "Odd" TO RESULT ELSE MOVE "Even" TO RESULT END-IF. EXIT PROGRAM. END PROGRAM EVEN-OR-ODD.
修正后的TESTS程序
IDENTIFICATION DIVISION. PROGRAM-ID. TESTS. DATA DIVISION. WORKING-STORAGE SECTION. 01 NUM PIC S9(8). 01 RESULT PIC A(4). PROCEDURE DIVISION. TESTSUITE 'Fixed tests'. TESTCASE 'Test 01'. MOVE 0 TO NUM INITIALIZE RESULT CALL 'EVEN-OR-ODD' USING BY CONTENT NUM BY REFERENCE RESULT EXPECT RESULT TO BE "Even". TESTCASE 'Test 02'. MOVE 1 TO NUM INITIALIZE RESULT CALL 'EVEN-OR-ODD' USING BY CONTENT NUM BY REFERENCE RESULT EXPECT RESULT TO BE "Odd". TESTCASE 'Test 03'. MOVE 7 TO NUM INITIALIZE RESULT CALL 'EVEN-OR-ODD' USING BY CONTENT NUM BY REFERENCE RESULT EXPECT RESULT TO BE "Odd". TESTCASE 'Test 04'. MOVE -42 TO NUM INITIALIZE RESULT CALL 'EVEN-OR-ODD' USING BY CONTENT NUM BY REFERENCE RESULT EXPECT RESULT TO BE "Even". TESTCASE 'Test 05'. MOVE -17 TO NUM INITIALIZE RESULT CALL 'EVEN-OR-ODD' USING BY CONTENT NUM BY REFERENCE RESULT EXPECT RESULT TO BE "Odd". STOP RUN. END PROGRAM TESTS.
验证说明
修正后的程序解决了以下问题:
- 参数列表匹配,
RESULT被正确关联到调用者的内存空间,避免未分配内存访问 - 临时变量移至
WORKING-STORAGE SECTION,由COBOL自动分配内存 - IF语句添加
END-IF闭合,编译器可正确识别程序结构,消除Last statement unknown提示 - 使用
EXIT PROGRAM返回调用者,保证测试用例可完整执行 - 字符串大小写与测试用例期望一致,测试断言可通过
内容的提问来源于stack exchange,提问作者Stefan Glova
相关产品推荐
相关产品推荐

