[Bug fortran/83567] New: Parametrized derived types: Segmentation fault when assigning a function return value

berke.durak at gmail dot com gcc-bugzilla@gcc.gnu.org
Sun Dec 24 02:08:00 GMT 2017


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

            Bug ID: 83567
           Summary: Parametrized derived types: Segmentation fault when
                    assigning a function return value
           Product: gcc
           Version: 8.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: berke.durak at gmail dot com
  Target Milestone: ---

Just wrote a small program to test the new parametrized derived types. 
Unfortunately I get runtime memory corruption errors and segmentation faults.

% cat pdf.f90

module pdt_m
  implicit none
  type :: vec(k)
     integer, len :: k=3
     integer :: foo(k)=[1,2,3]
  end type vec
contains
  function addvv(a,b) result(c)
    type(vec(k=*)), intent(in) :: a
    type(vec(k=*)), intent(in) :: b
    type(vec(k=a%k)) :: c

    c%foo=a%foo+b%foo
  end function
end module pdt_m

program test_pdt
  use pdt_m
  implicit none
  type(vec) :: u,v,w

  u%foo=[1,2,3]
  v%foo=[2,3,4]
  w=addvv(u,v)
  print *,w
end program test_pdt

% gfortran-8 --version
GNU Fortran (Debian 8-20171223-1) 8.0.0 20171223 (experimental) [trunk revision
255988]

% gfortran-8 pdt.f90 -o pdt -Wall -O3 -g -fcheck=all -Wextra

% ./pdt

           3           0           0           7
*** Error in `./pdt': double free or corruption (fasttop): 0x000055cc59c66630
***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x70bfb)[0x7f303fe40bfb]
/lib/x86_64-linux-gnu/libc.so.6(+0x76fc6)[0x7f303fe46fc6]
/lib/x86_64-linux-gnu/libc.so.6(+0x7780e)[0x7f303fe4780e]
./pdt(+0xdf0)[0x55cc59a0fdf0]
./pdt(+0x89f)[0x55cc59a0f89f]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf1)[0x7f303fdf02e1]
./pdt(+0x8da)[0x55cc59a0f8da]
======= Memory map: ========
55cc59a0f000-55cc59a11000 r-xp 00000000 fe:04 1316416                   
/home/alpha/src/fortran/23_Parametrized_derived_types/pdt
55cc59c10000-55cc59c11000 r--p 00001000 fe:04 1316416                   
/home/alpha/src/fortran/23_Parametrized_derived_types/pdt
55cc59c11000-55cc59c12000 rw-p 00002000 fe:04 1316416                   
/home/alpha/src/fortran/23_Parametrized_derived_types/pdt
55cc59c63000-55cc59c84000 rw-p 00000000 00:00 0                          [heap]
7f3038000000-7f3038021000 rw-p 00000000 00:00 0 
7f3038021000-7f303c000000 ---p 00000000 00:00 0 
7f303fbb6000-7f303fbcf000 r-xp 00000000 fe:04 393306                    
/lib/x86_64-linux-gnu/libz.so.1.2.8
7f303fbcf000-7f303fdce000 ---p 00019000 fe:04 393306                    
/lib/x86_64-linux-gnu/libz.so.1.2.8
7f303fdce000-7f303fdcf000 r--p 00018000 fe:04 393306                    
/lib/x86_64-linux-gnu/libz.so.1.2.8
7f303fdcf000-7f303fdd0000 rw-p 00019000 fe:04 393306                    
/lib/x86_64-linux-gnu/libz.so.1.2.8
7f303fdd0000-7f303ff63000 r-xp 00000000 fe:04 396680                    
/lib/x86_64-linux-gnu/libc-2.24.so
7f303ff63000-7f3040163000 ---p 00193000 fe:04 396680                    
/lib/x86_64-linux-gnu/libc-2.24.so
7f3040163000-7f3040167000 r--p 00193000 fe:04 396680                    
/lib/x86_64-linux-gnu/libc-2.24.so
7f3040167000-7f3040169000 rw-p 00197000 fe:04 396680                    
/lib/x86_64-linux-gnu/libc-2.24.so
7f3040169000-7f304016d000 rw-p 00000000 00:00 0 
7f304016d000-7f30401ab000 r-xp 00000000 fe:04 5512042                   
/usr/lib/x86_64-linux-gnu/libquadmath.so.0.0.0
7f30401ab000-7f30403ab000 ---p 0003e000 fe:04 5512042                   
/usr/lib/x86_64-linux-gnu/libquadmath.so.0.0.0
7f30403ab000-7f30403ac000 r--p 0003e000 fe:04 5512042                   
/usr/lib/x86_64-linux-gnu/libquadmath.so.0.0.0
7f30403ac000-7f30403ad000 rw-p 0003f000 fe:04 5512042                   
/usr/lib/x86_64-linux-gnu/libquadmath.so.0.0.0
7f30403ad000-7f30403c4000 r-xp 00000000 fe:04 393267                    
/lib/x86_64-linux-gnu/libgcc_s.so.1
7f30403c4000-7f30405c3000 ---p 00017000 fe:04 393267                    
/lib/x86_64-linux-gnu/libgcc_s.so.1
7f30405c3000-7f30405c4000 r--p 00016000 fe:04 393267                    
/lib/x86_64-linux-gnu/libgcc_s.so.1
7f30405c4000-7f30405c5000 rw-p 00017000 fe:04 393267                    
/lib/x86_64-linux-gnu/libgcc_s.so.1
7f30405c5000-7f30406c8000 r-xp 00000000 fe:04 396688                    
/lib/x86_64-linux-gnu/libm-2.24.so
7f30406c8000-7f30408c7000 ---p 00103000 fe:04 396688                    
/lib/x86_64-linux-gnu/libm-2.24.so
7f30408c7000-7f30408c8000 r--p 00102000 fe:04 396688                    
/lib/x86_64-linux-gnu/libm-2.24.so
7f30408c8000-7f30408c9000 rw-p 00103000 fe:04 396688                    
/lib/x86_64-linux-gnu/libm-2.24.so
7f30408c9000-7f3040b1a000 r-xp 00000000 fe:04 5621520                   
/usr/lib/x86_64-linux-gnu/libgfortran.so.5.0.0
7f3040b1a000-7f3040d19000 ---p 00251000 fe:04 5621520                   
/usr/lib/x86_64-linux-gnu/libgfortran.so.5.0.0
7f3040d19000-7f3040d1a000 r--p 00250000 fe:04 5621520                   
/usr/lib/x86_64-linux-gnu/libgfortran.so.5.0.0
7f3040d1a000-7f3040d1c000 rw-p 00251000 fe:04 5621520                   
/usr/lib/x86_64-linux-gnu/libgfortran.so.5.0.0
7f3040d1c000-7f3040d3f000 r-xp 00000000 fe:04 393406                    
/lib/x86_64-linux-gnu/ld-2.24.so
7f3040efc000-7f3040f00000 rw-p 00000000 00:00 0 
7f3040f3b000-7f3040f3f000 rw-p 00000000 00:00 0 
7f3040f3f000-7f3040f40000 r--p 00023000 fe:04 393406                    
/lib/x86_64-linux-gnu/ld-2.24.so
7f3040f40000-7f3040f41000 rw-p 00024000 fe:04 393406                    
/lib/x86_64-linux-gnu/ld-2.24.so
7f3040f41000-7f3040f42000 rw-p 00000000 00:00 0 
7ffd282a1000-7ffd282c2000 rw-p 00000000 00:00 0                         
[stack]
7ffd2834b000-7ffd2834d000 r--p 00000000 00:00 0                          [vvar]
7ffd2834d000-7ffd2834f000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                 
[vsyscall]

Program received signal SIGABRT: Process abort signal.

Backtrace for this error:
#0  0x7f30408e6201 in ???
#1  0x7f30408e5443 in ???
#2  0x7f303fe0305f in ???
#3  0x7f303fe02fff in ???
#4  0x7f303fe04429 in ???
#5  0x7f303fe40bff in ???
#6  0x7f303fe46fc5 in ???
#7  0x7f303fe4780d in ???
#8  0x55cc59a0fdef in test_pdt
        at /home/alpha/src/fortran/23_Parametrized_derived_types/pdt.f90:26
#9  0x55cc59a0f89e in main
        at /home/alpha/src/fortran/23_Parametrized_derived_types/pdt.f90:18
zsh: abort      ./pdt

% gdb --args ./pdt

...

Program received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
51      ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1  0x00007ffff6ec142a in __GI_abort () at abort.c:89
#2  0x00007ffff6efdc00 in __libc_message (do_abort=do_abort@entry=2,
fmt=fmt@entry=0x7ffff6ff2d78 "*** Error in `%s': %s: 0x%s ***\n")
    at ../sysdeps/posix/libc_fatal.c:175
#3  0x00007ffff6f03fc6 in malloc_printerr (action=3, str=0x7ffff6ff2ed0 "double
free or corruption (fasttop)", ptr=<optimized out>, ar_ptr=<optimized out>)
    at malloc.c:5049
#4  0x00007ffff6f0480e in _int_free (av=0x7ffff7224b00 <main_arena>,
p=0x55555575a620, have_lock=0) at malloc.c:3905
#5  0x0000555555554df0 in test_pdt () at pdt.f90:26
#6  0x000055555555489f in main (argc=argc@entry=1, argv=0x7fffffffe734) at
pdt.f90:18
#7  0x00007ffff6ead2e1 in __libc_start_main (main=0x555555554880 <main>,
argc=1, argv=0x7fffffffe468, init=<optimized out>, fini=<optimized out>, 
    rtld_fini=<optimized out>, stack_end=0x7fffffffe458) at
../csu/libc-start.c:291
#8  0x00005555555548da in _start ()

% valgrind ./pdt

% valgrind ./pdt        
==7993== Memcheck, a memory error detector
==7993== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==7993== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==7993== Command: ./pdt
==7993== 
==7993== Invalid read of size 4
==7993==    at 0x5040B40: ??? (in
/usr/lib/x86_64-linux-gnu/libgfortran.so.5.0.0)
==7993==    by 0x5040D50: ??? (in
/usr/lib/x86_64-linux-gnu/libgfortran.so.5.0.0)
==7993==    by 0x50454DD: ??? (in
/usr/lib/x86_64-linux-gnu/libgfortran.so.5.0.0)
==7993==    by 0x5046194: ??? (in
/usr/lib/x86_64-linux-gnu/libgfortran.so.5.0.0)
==7993==    by 0x108DCD: MAIN__ (pdt.f90:25)
==7993==    by 0x10889E: main (pdt.f90:18)
==7993==  Address 0x5fa1bb0 is 0 bytes inside a block of size 12 free'd
==7993==    at 0x4C2CE1B: free (vg_replace_malloc.c:530)
==7993==    by 0x108AF0: __pdt_m_MOD_addvv (pdt.f90:14)
==7993==    by 0x108D23: MAIN__ (pdt.f90:24)
==7993==    by 0x10889E: main (pdt.f90:18)
==7993==  Block was alloc'd at
==7993==    at 0x4C2BBEF: malloc (vg_replace_malloc.c:299)
==7993==    by 0x108A30: __pdt_m_MOD_addvv (pdt.f90:14)
==7993==    by 0x108D23: MAIN__ (pdt.f90:24)
==7993==    by 0x10889E: main (pdt.f90:18)
==7993== 
           3           3           5           7
==7993== Invalid free() / delete / delete[] / realloc()
==7993==    at 0x4C2CE1B: free (vg_replace_malloc.c:530)
==7993==    by 0x108DEF: MAIN__ (pdt.f90:26)
==7993==    by 0x10889E: main (pdt.f90:18)
==7993==  Address 0x5fa1bb0 is 0 bytes inside a block of size 12 free'd
==7993==    at 0x4C2CE1B: free (vg_replace_malloc.c:530)
==7993==    by 0x108AF0: __pdt_m_MOD_addvv (pdt.f90:14)
==7993==    by 0x108D23: MAIN__ (pdt.f90:24)
==7993==    by 0x10889E: main (pdt.f90:18)
==7993==  Block was alloc'd at
==7993==    at 0x4C2BBEF: malloc (vg_replace_malloc.c:299)
==7993==    by 0x108A30: __pdt_m_MOD_addvv (pdt.f90:14)
==7993==    by 0x108D23: MAIN__ (pdt.f90:24)
==7993==    by 0x10889E: main (pdt.f90:18)
==7993== 
==7993== 
==7993== HEAP SUMMARY:
==7993==     in use at exit: 12 bytes in 1 blocks
==7993==   total heap usage: 25 allocs, 25 frees, 13,544 bytes allocated
==7993== 
==7993== LEAK SUMMARY:
==7993==    definitely lost: 12 bytes in 1 blocks
==7993==    indirectly lost: 0 bytes in 0 blocks
==7993==      possibly lost: 0 bytes in 0 blocks
==7993==    still reachable: 0 bytes in 0 blocks
==7993==         suppressed: 0 bytes in 0 blocks
==7993== Rerun with --leak-check=full to see details of leaked memory
==7993== 
==7993== For counts of detected and suppressed errors, rerun with: -v
==7993== ERROR SUMMARY: 4 errors from 2 contexts (suppressed: 0 from 0)

% valgrind --leak-check=full -v ./pdt

...
==8016== Invalid read of size 4
==8016==    at 0x5040B40: ??? (in
/usr/lib/x86_64-linux-gnu/libgfortran.so.5.0.0)
==8016==    by 0x5040D50: ??? (in
/usr/lib/x86_64-linux-gnu/libgfortran.so.5.0.0)
==8016==    by 0x50454DD: ??? (in
/usr/lib/x86_64-linux-gnu/libgfortran.so.5.0.0)
==8016==    by 0x5046194: ??? (in
/usr/lib/x86_64-linux-gnu/libgfortran.so.5.0.0)
==8016==    by 0x108DCD: MAIN__ (pdt.f90:25)
==8016==    by 0x10889E: main (pdt.f90:18)
==8016==  Address 0x5fa1bb0 is 0 bytes inside a block of size 12 free'd
==8016==    at 0x4C2CE1B: free (vg_replace_malloc.c:530)
==8016==    by 0x108AF0: __pdt_m_MOD_addvv (pdt.f90:14)
==8016==    by 0x108D23: MAIN__ (pdt.f90:24)
==8016==    by 0x10889E: main (pdt.f90:18)
==8016==  Block was alloc'd at
==8016==    at 0x4C2BBEF: malloc (vg_replace_malloc.c:299)
==8016==    by 0x108A30: __pdt_m_MOD_addvv (pdt.f90:14)
==8016==    by 0x108D23: MAIN__ (pdt.f90:24)
==8016==    by 0x10889E: main (pdt.f90:18)
==8016== 
           3           3           5           7
==8016== Invalid free() / delete / delete[] / realloc()
==8016==    at 0x4C2CE1B: free (vg_replace_malloc.c:530)
==8016==    by 0x108DEF: MAIN__ (pdt.f90:26)
==8016==    by 0x10889E: main (pdt.f90:18)
==8016==  Address 0x5fa1bb0 is 0 bytes inside a block of size 12 free'd
==8016==    at 0x4C2CE1B: free (vg_replace_malloc.c:530)
==8016==    by 0x108AF0: __pdt_m_MOD_addvv (pdt.f90:14)
==8016==    by 0x108D23: MAIN__ (pdt.f90:24)
==8016==    by 0x10889E: main (pdt.f90:18)
==8016==  Block was alloc'd at
==8016==    at 0x4C2BBEF: malloc (vg_replace_malloc.c:299)
==8016==    by 0x108A30: __pdt_m_MOD_addvv (pdt.f90:14)
==8016==    by 0x108D23: MAIN__ (pdt.f90:24)
==8016==    by 0x10889E: main (pdt.f90:18)
==8016== 
==8016== 
==8016== HEAP SUMMARY:
==8016==     in use at exit: 12 bytes in 1 blocks
==8016==   total heap usage: 25 allocs, 25 frees, 13,544 bytes allocated
==8016== 
==8016== Searching for pointers to 1 not-freed blocks
==8016== Checked 101,576 bytes
==8016== 
==8016== 12 bytes in 1 blocks are definitely lost in loss record 1 of 1
==8016==    at 0x4C2BBEF: malloc (vg_replace_malloc.c:299)
==8016==    by 0x108CC4: MAIN__ (pdt.f90:26)
==8016==    by 0x10889E: main (pdt.f90:18)
==8016== 
==8016== LEAK SUMMARY:
==8016==    definitely lost: 12 bytes in 1 blocks
==8016==    indirectly lost: 0 bytes in 0 blocks
==8016==      possibly lost: 0 bytes in 0 blocks
==8016==    still reachable: 0 bytes in 0 blocks
==8016==         suppressed: 0 bytes in 0 blocks
==8016== 
==8016== ERROR SUMMARY: 5 errors from 3 contexts (suppressed: 0 from 0)
==8016== 
==8016== 1 errors in context 1 of 3:
==8016== Invalid free() / delete / delete[] / realloc()
==8016==    at 0x4C2CE1B: free (vg_replace_malloc.c:530)
==8016==    by 0x108DEF: MAIN__ (pdt.f90:26)
==8016==    by 0x10889E: main (pdt.f90:18)
==8016==  Address 0x5fa1bb0 is 0 bytes inside a block of size 12 free'd
==8016==    at 0x4C2CE1B: free (vg_replace_malloc.c:530)
==8016==    by 0x108AF0: __pdt_m_MOD_addvv (pdt.f90:14)
==8016==    by 0x108D23: MAIN__ (pdt.f90:24)
==8016==    by 0x10889E: main (pdt.f90:18)
==8016==  Block was alloc'd at
==8016==    at 0x4C2BBEF: malloc (vg_replace_malloc.c:299)
==8016==    by 0x108A30: __pdt_m_MOD_addvv (pdt.f90:14)
==8016==    by 0x108D23: MAIN__ (pdt.f90:24)
==8016==    by 0x10889E: main (pdt.f90:18)
==8016== 
==8016== 
==8016== 3 errors in context 2 of 3:
==8016== Invalid read of size 4
==8016==    at 0x5040B40: ??? (in
/usr/lib/x86_64-linux-gnu/libgfortran.so.5.0.0)
==8016==    by 0x5040D50: ??? (in
/usr/lib/x86_64-linux-gnu/libgfortran.so.5.0.0)
==8016==    by 0x50454DD: ??? (in
/usr/lib/x86_64-linux-gnu/libgfortran.so.5.0.0)
==8016==    by 0x5046194: ??? (in
/usr/lib/x86_64-linux-gnu/libgfortran.so.5.0.0)
==8016==    by 0x108DCD: MAIN__ (pdt.f90:25)
==8016==    by 0x10889E: main (pdt.f90:18)
==8016==  Address 0x5fa1bb0 is 0 bytes inside a block of size 12 free'd
==8016==    at 0x4C2CE1B: free (vg_replace_malloc.c:530)
==8016==    by 0x108AF0: __pdt_m_MOD_addvv (pdt.f90:14)
==8016==    by 0x108D23: MAIN__ (pdt.f90:24)
==8016==    by 0x10889E: main (pdt.f90:18)
==8016==  Block was alloc'd at
==8016==    at 0x4C2BBEF: malloc (vg_replace_malloc.c:299)
==8016==    by 0x108A30: __pdt_m_MOD_addvv (pdt.f90:14)
==8016==    by 0x108D23: MAIN__ (pdt.f90:24)
==8016==    by 0x10889E: main (pdt.f90:18)
...


More information about the Gcc-bugs mailing list