https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68594

            Bug ID: 68594
           Summary: [regression] libfortran WRITE() ERR option causing
                    segfault when used twice
           Product: gcc
           Version: 4.8.4
            Status: UNCONFIRMED
          Severity: major
          Priority: P3
         Component: libfortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: luca.dallolio at gmail dot com
  Target Milestone: ---

Created attachment 36861
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=36861&action=edit
double WRITE with ERR option causing segfault in Trusty

A simple fortran program causes a segmentation fault under Ubuntu 14.04 Trusty
but works fine in Ubuntu 12.04 Precise.
The problem can be reproduced by using the ERR option of the WRITE command
twice :

      PROGRAM WRITESEGF2
      WRITE (*,'(I8)',ERR=40) 3.14
   40 CONTINUE
      WRITE (*,'(I8)',ERR=80) 3.14
   80 CONTINUE
      END 

Here the compilation options :

gfortran -O0 -g -fcheck=all -o writesegfault2 writesegfault2.f

This is the output in Trusty :

(trusty64)$ ./writesegfault2 
Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

Backtrace for this error:
#0  0x7F1B871EA777
#1  0x7F1B871EAD7E
#2  0x7F1B86E42D3F
#3  0x7F1B86EA41B4
#4  0x7F1B872A1D1E
#5  0x7F1B872AC43C
#6  0x7F1B872AE558
#7  0x40088E in writesegf2 at writesegfault2.f:4
Segmentation fault (core dumped)

GDB says :

(trusty64)$ gdb ./writesegfault2

Program received signal SIGSEGV, Segmentation fault.
__memcpy_sse2_unaligned () at
../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S:153
153     ../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S: No such file or
directory.

In Precise there is simply no output, as expected :

(precise64)$ ./writesegfault2
(precise64)$ 

A single WRITE with ERR label seems to work fine, even in Trusty :

      PROGRAM WRITEOK
      WRITE (*,'(I8)',ERR=40) 3.14
   40 CONTINUE
      WRITE (*,'(I8)') 3
      WRITE (*,'(E8.3)') 3.14
      END

(trusty64)$ ./writeok 
       3
.314E+01

Here is another variant causing the problem :

      PROGRAM WRITESEGF
      WRITE (*,'(I8)',ERR=40) 3.14
   40 CONTINUE
      WRITE (*,'(I8)') 3.14
      END

Another segmentation fault seems to be caused by a WRITE with ERR label,
folowed by a simple conversion (should be an error instead) :

(trusty64)$ ./writesegfault 

Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

Backtrace for this error:
#0  0x7FF7F2BCB777
#1  0x7FF7F2BCBD7E
#2  0x7FF7F2823D3F
#3  0x7FF7F28851B4
#4  0x7FF7F2C82D1E
#5  0x7FF7F2C8D43C
#6  0x7FF7F2C8F558
#7  0x40088E in MAIN__ at writesegfault.f:4
Segmentation fault (core dumped)

Without using labels, it should be an error:

  PROGRAM WRITEERR
  WRITE (*,'(I8)') 3.14
  END

When running this, in both Trusty and Precise :

(trusty64)$ ./writeerror 
At line 2 of file writeerror.f (unit = 6, file = 'stdout')
Fortran runtime error: Expected INTEGER for item 1 in formatted transfer, got
REAL
(I8)
 ^

All this was reproduced using different versions of gfortran : 4.6.3 in Precise
and 4.8.4 in Trusty.
Nothing changes by switching gfortran (backporting 4.8 in Precise and
installing 4.6 in Trusty), changing architecture (32 and 64 bit), moving
binaries.
The issue stays the same, so it should be a libgfortran or glibc issue...

Reply via email to