[Bug libfortran/68594] New: [regression] libfortran WRITE() ERR option causing segfault when used twice

2015-11-28 Thread luca.dallolio at gmail dot com
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...

[Bug libfortran/68594] libfortran WRITE() ERR option causing segfault when used twice

2015-11-28 Thread luca.dallolio at gmail dot com
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68594

Luca Dall'Olio  changed:

   What|Removed |Added

 Status|WAITING |RESOLVED
 Resolution|--- |FIXED

--- Comment #2 from Luca Dall'Olio  ---
Thank you very much for this information, I will try to upgrade to Wily.

I agree this situation should be rare, we found it by compiling and testing a
NASA code recently open sourced : https://github.com/nasa/NASTRAN