https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61830
Bug ID: 61830
Summary: Memory leak with assignment to array of derived types
with allocatable components
Product: gcc
Version: 4.8.3
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: fortran
Assignee: unassigned at gcc dot gnu.org
Reporter: sfilippone at uniroma2 dot it
Created attachment 33132
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=33132&action=edit
test case
Hi,
The attached code shows the problem.
When I started investigating I was using 4.10 but I ran into PR61819 while
reducing the test case.
With 4.8.3 I get the following:
--------------------------------------------
[sfilippo@jacobi runs]$ gfortran -v
Using built-in specs.
COLLECT_GCC=gfortran
COLLECT_LTO_WRAPPER=/usr/local/gnu/4.8.3/libexec/gcc/x86_64-unknown-linux-gnu/4.8.3/lto-wrapper
Target: x86_64-unknown-linux-gnu
Configured with: ../gcc-4.8.3/configure --prefix=/usr/local/gnu/4.8.3
--enable-languages=c,c++,fortran --with-gmp=/home/travel/GNUBUILD/gmp
--with-mpfr=/home/travel/GNUBUILD/mpfr --with-mpc=/home/travel/GNUBUILD/mpc
Thread model: posix
gcc version 4.8.3 (GCC)
[sfilippo@jacobi runs]$ valgrind --leak-check=full ./foo-test-leak
==20638== Memcheck, a memory error detector
==20638== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==20638== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==20638== Command: ./foo-test-leak
==20638==
Scalar deallocation
Deallocate class() component
Scalar deallocation
Deallocate class() component
Scalar deallocation
Deallocate class() component
Scalar deallocation
Deallocate class() component
Scalar deallocation
Deallocate class() component
Scalar deallocation
Deallocate class() component
Scalar deallocation
Deallocate class() component
Scalar deallocation
Deallocate class() component
Scalar deallocation
Deallocate class() component
Scalar deallocation
Deallocate class() component
Scalar deallocation
Deallocate class() component
Scalar deallocation
Deallocate class() component
==20638==
==20638== HEAP SUMMARY:
==20638== in use at exit: 6,164 bytes in 23 blocks
==20638== total heap usage: 89 allocs, 66 frees, 35,518 bytes allocated
==20638==
==20638== 560 (48 direct, 512 indirect) bytes in 1 blocks are definitely lost
in loss record 3 of 5
==20638== at 0x4A069EE: malloc (vg_replace_malloc.c:270)
==20638== by 0x400B70: __foo_base_mod_MOD_foo_geall (foo-test-leak.f90:96)
==20638== by 0x401F8B: __foo_scalar_field_mod_MOD_new_scalar_field
(foo-test-leak.f90:141)
==20638== by 0x40271F: __foo_vector_field_mod_MOD_new_vector_field
(foo-test-leak.f90:163)
==20638== by 0x402AC8: MAIN__ (foo-test-leak.f90:188)
==20638== by 0x4031D3: main (foo-test-leak.f90:179)
==20638==
==20638== 5,600 (480 direct, 5,120 indirect) bytes in 10 blocks are definitely
lost in loss record 5 of 5
==20638== at 0x4A069EE: malloc (vg_replace_malloc.c:270)
==20638== by 0x400B70: __foo_base_mod_MOD_foo_geall (foo-test-leak.f90:96)
==20638== by 0x401F8B: __foo_scalar_field_mod_MOD_new_scalar_field
(foo-test-leak.f90:141)
==20638== by 0x40271F: __foo_vector_field_mod_MOD_new_vector_field
(foo-test-leak.f90:163)
==20638== by 0x402C9E: MAIN__ (foo-test-leak.f90:192)
==20638== by 0x4031D3: main (foo-test-leak.f90:179)
==20638==
==20638== LEAK SUMMARY:
==20638== definitely lost: 528 bytes in 11 blocks
==20638== indirectly lost: 5,632 bytes in 11 blocks
==20638== possibly lost: 0 bytes in 0 blocks
==20638== still reachable: 4 bytes in 1 blocks
==20638== suppressed: 0 bytes in 0 blocks
==20638== Reachable blocks (those to which a pointer was found) are not shown.
==20638== To see them, rerun with: --leak-check=full --show-reachable=yes
==20638==
==20638== For counts of detected and suppressed errors, rerun with: -v
==20638== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 6 from 6)
-------------------------------------------------------------------------------
If I change line 163
this%u = [new_scalar_field()]
into
do i=1, size(this%u)
associate(sf=>this%u(i))
sf = new_scalar_field()
end associate
end do
then I get no leak
[sfilippo@jacobi runs]$ valgrind --leak-check=full ./foo-test-leak-fixed
==20852== Memcheck, a memory error detector
==20852== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==20852== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==20852== Command: ./foo-test-leak-fixed
==20852==
Scalar deallocation
Deallocate class() component
Scalar deallocation
Deallocate class() component
Scalar deallocation
Deallocate class() component
Scalar deallocation
Deallocate class() component
Scalar deallocation
Deallocate class() component
Scalar deallocation
Deallocate class() component
Scalar deallocation
Deallocate class() component
Scalar deallocation
Deallocate class() component
Scalar deallocation
Deallocate class() component
Scalar deallocation
Deallocate class() component
Scalar deallocation
Deallocate class() component
Scalar deallocation
Deallocate class() component
==20852==
==20852== HEAP SUMMARY:
==20852== in use at exit: 4 bytes in 1 blocks
==20852== total heap usage: 67 allocs, 66 frees, 29,364 bytes allocated
==20852==
==20852== LEAK SUMMARY:
==20852== definitely lost: 0 bytes in 0 blocks
==20852== indirectly lost: 0 bytes in 0 blocks
==20852== possibly lost: 0 bytes in 0 blocks
==20852== still reachable: 4 bytes in 1 blocks
==20852== suppressed: 0 bytes in 0 blocks
==20852== Reachable blocks (those to which a pointer was found) are not shown.
==20852== To see them, rerun with: --leak-check=full --show-reachable=yes
==20852==
==20852== For counts of detected and suppressed errors, rerun with: -v
==20852== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 6)