gnucobol-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[open-cobol-list] [GNU Cobol 2.0] crash on Solaris (sparc) while executi


From: Paul . Meinhardt
Subject: [open-cobol-list] [GNU Cobol 2.0] crash on Solaris (sparc) while executing SET ADDRESS OF Y2 UP BY 4
Date: Mon, 15 Dec 2014 11:12:15 +0100

Hello,

the following small program causes a crash (Signal SIGSEGV) on Solaris (sparc). The same program runs without problems on Windows and shows the expected results.

prog.cob: 16: Attempt to reference unallocated memory (Signal SIGSEGV)
Abnormal termination - File contents may be incorrect

I used the gnu cobol branch 2.0 r470

       IDENTIFICATION   DIVISION.
       PROGRAM-ID.      prog.
       DATA             DIVISION.
       WORKING-STORAGE  SECTION.
       01 XX.
         02 XX-1           PIC X(4) VALUE "1234".
         02 XX-2           PIC X(4) VALUE "5678".
       01 P-XX-1        POINTER.
       01 P-XX-2        POINTER.
       LINKAGE          SECTION.
       01 Y2            PIC X(4).
       PROCEDURE        DIVISION.
         SET P-XX-1 TO ADDRESS OF XX-1
         SET P-XX-2 TO ADDRESS OF XX-2
         SET ADDRESS OF Y2 TO ADDRESS OF XX-1
         SET ADDRESS OF Y2 UP BY 4
         IF Y2 NOT = XX-2
            DISPLAY "Test 2 '" Y2 "'"
            END-DISPLAY
         END-IF
         IF ADDRESS OF Y2 NOT= P-XX-2
            DISPLAY "Pointer test failed"
         END-IF
         STOP RUN.
   
The crash occurs in the first memcpy call of

cob_pointer_manip (cob_field *f1, cob_field *f2, const unsigned int addsub)
{
        unsigned char   *tmptr;
        memcpy (&tmptr, f1->data, sizeof(void *));
        if (addsub) {
                tmptr -= cob_get_int (f2);
        } else {
                tmptr += cob_get_int (f2);
        }
        memcpy (f1->data, &tmptr, sizeof(void *));
}

the following call to cob_pointer_manip in the generated C code shows the problem:

  /* Line: 16        : SET                : prog.cob */
  cob_set_location (st_1, 16, NULL, NULL, st_2);
  cob_pointer_manip (b_10, (cob_field *)&c_1, 0);
 
the variable b_10 is defined as:

/* LINKAGE SECTION (Items not referenced by USING clause) */
static unsigned char        *b_10 = NULL;  /* Y2 */

but the cob_pointer_manip function expects a pointer to a cob_field structure and therefore f1->data points to nowhere.

During compilation I get the following warnings:

address@hidden: ~/pme-test/cob-address $ cobc -g -x prog.cob
prog.c: In function 'prog_':
prog.c:124:3: warning: passing argument 1 of 'cob_pointer_manip' from incompatible pointer type
prog.c.h:33:1: note: expected 'struct cob_field *' but argument is of type 'unsigned char *'

The enclosed ZIP (crash.zip) file contains the sample program and the generated C source and config.log.zip contains the configure log file.

Some data about my solaris system:

uname -a
SunOS sol10d 5.10 Generic_142909-17 sun4u sparc SUNW,Sun-Fire-V440

Any suggestions?



Best Regards

Paul Meinhardt  
(Development)

Attachment: crash.zip
Description: Zip archive

Attachment: config.log.zip
Description: Zip archive


reply via email to

[Prev in Thread] Current Thread [Next in Thread]