[Bug fortran/93918] New: Segfault with -Ofast when calling a routine with an array argument array(:)%component
mscfd at gmx dot net
gcc-bugzilla@gcc.gnu.org
Tue Feb 25 06:02:00 GMT 2020
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93918
Bug ID: 93918
Summary: Segfault with -Ofast when calling a routine with an
array argument array(:)%component
Product: gcc
Version: 9.1.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: fortran
Assignee: unassigned at gcc dot gnu.org
Reporter: mscfd at gmx dot net
Target Milestone: ---
The code below results in a SEGFAULT when compiled with -Ofast in gfortran
9.1.1 as well as some recent compiled gfortran-10 commit. With -O2 the program
finishes without errors (also no reports from valgrind).
The segfault only occurs, if the array size is sufficiently large (reducing n
by a factor of 10 avoids the problem). valgrind reports a stack problem:
==28808== Warning: client switching stacks? SP change: 0x1ffeffea70 -->
0x1ffc9d9070
==28808== to suppress, use: --max-stackframe=40000000 or greater
==28808== Invalid write of size 8
==28808== at 0x400818: ppp (ppp.f90:31)
==28808== by 0x400818: main (ppp.f90:19)
==28808== Address 0x1ffc9d9068 is on thread 1's stack
==28808==
==28808== Can't extend stack to 0x1ffc9d8118 during signal delivery for thread
1:
==28808== no stack segment
==28808==
==28808== Process terminating with default action of signal 11 (SIGSEGV):
dumping core
==28808== Access not within mapped region at address 0x1FFC9D8118
==28808== at 0x400818: ppp (ppp.f90:31)
==28808== by 0x400818: main (ppp.f90:19)
==28808== If you believe this happened as a result of a stack
==28808== overflow in your program's main thread (unlikely but
==28808== possible), you can try to increase the size of the
==28808== main thread stack using the --main-stacksize= flag.
==28808== The main thread stack size used in this run was 8388608.
==28808== Invalid write of size 8
==28808== at 0x4A2861A: _vgnU_freeres (vg_preloaded.c:59)
==28808== Address 0x1ffc9d8fe0 is on thread 1's stack
Also increasing stacksize as suggested by valgrind also avoids the invalid
write. Does gfortran generate a temporary array here (but only with -Ofast)?
module mod
implicit none
private
public foo
contains
subroutine foo(a, n)
integer, dimension(:), intent(in) :: a
integer, intent(in) :: n
print *, sum(a(1:n)), n
end subroutine foo
end module mod
program ppp
use mod
implicit none
type :: tt
integer :: u = 1
end type tt
type(tt), dimension(:), allocatable :: r
integer :: n
n = 10000000
allocate(r(1:n))
call foo(r(:)%u, n)
deallocate(r)
end program ppp
More information about the Gcc-bugs
mailing list