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) ...