Error 115 Unexpected signal (Signal 4) from illegal characters in uninitialized numeric field




A program stops with fatal error:

Error 115 Unexpected signal (Signal 4)

on SUSE or Red Hat Linux running on s390 (i.e. z/390 or IBM 390) hardware, when the program is compiled to executable or .gnt or .so.



Modify the COBOL source code so invalid data is not used, including making sure data items are initialized before being used, or as an alternative, compile with the compiler directive SIGN-FIXUP


Consider this example program:

000001 program-id. cd1.
000002 environment division.
000003 configuration section.
000004 data division.
000006 working-storage section.
000007      01 WS-CAS-ID          PIC S9(8) COMP-3.
000008      01 WSH-HOLD.
000009        05 WSH-PREV-CASE-ID PIC S9(8) COMP-3.
000011 procedure division.
000012     move 1 to WS-CAS-ID
000014         display "is equal"
000015     ELSE
000016         display "not equal"
000017     END-IF
000018     .
000020     goback
000021     .

When compiled to .int on any platform (Windows, AIX, Solaris, Linux) then at runtime the program stops with this error:

163 Illegal character in numeric field

because WSH-PREV-CASE-ID is not initialized before being used, and so contains spaces (or contains the value specified in the DEFAULTBYTE compiler directive). Spaces are illegal characters in COMP-3 representation.

The best solution is to modify the code so invalid data is not used, including making sure data items are initialized before being used. However, the code may originally have come from the IBM mainframe, which handles uninitialized or invalid data differently.

When compiled to executable or .gnt or .so, on all platforms (Windows, AIX, Solaris, Linux) except Linux on s390 hardware, at runtime the program displays:

not equal

But on s390 hardware, it stops with Error 115 Unexpected signal (Signal 4).  Signal 4 means "illegal instruction", that is, the machine code in the running executable is illegal.

s390 processors provide machine code instructions specifically for handing COBOL comp-3 and display data, and the Micro Focus Native Code Generator generates machine code using these instructions where possible and where they are faster than the alternatives. These machine instructions raise a signal if the data is not valid. This behavior is compliant with ANSI, MF, and IBM documentation. If numeric data is invalid, and you do not use numeric checking, anything can happen.

The compiler directive SIGN-FIXUP provides compatibility with the way IBM Mainframe COBOL handles invalid data. When compiled with SIGN-FIXUP to executable or .gnt or .so, on all platforms including s390, the program will display:

not equal

This will solve the error 115 Unexpected signal.




Red Hat
error 115
signal 4
Error 163
Comment List
Related Discussions