You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

错误原因分析

  1. 调用参数不匹配:测试用例调用EVEN-OR-ODD时传入了NUM和RESULT两个参数,但被调用程序的PROCEDURE DIVISION仅声明USING NUM,未包含RESULT。这导致RESULT的内存地址未被正确关联,程序访问RESULT时触发未分配内存引用错误。
  2. LINKAGE SECTION滥用:R和Q是计算临时变量,不属于外部传入参数,不应放在LINKAGE SECTION中。该段仅用于接收外部传入的数据,未关联外部内存的变量会导致未分配内存访问。
  3. IF语句缺少闭合:多行IF语句未使用END IF闭合,导致COBOL编译器无法正确识别程序逻辑边界,出现Last statement unknown提示。
  4. 终止语句错误:被调用程序使用STOP RUN会直接终止整个程序,而非返回调用者,导致测试用例后续逻辑无法执行,同时引发程序异常。应使用EXIT PROGRAM返回。
  5. 字符串大小写不匹配:程序中返回的是大写的"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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 00:47:12