Double Free or Corruption Error
September 18, 2008
A double free or corruption error in a Fortran program means that
your program has somehow invoked the free()
C runtime function
with an invalid pointer. This can happen if it is using dynamic
memory allocation or if it is calling free()
in C directly
somehow.
A common cause of this error is that your code has overwritten memory somewhere due to an out-of-bounds array index. Take the following program, for example:
!! Generates a "double free or corruption" error.
program free
integer, dimension(:), allocatable :: data
integer :: i
allocate(data(5))
do i = 1, 5
data(i-1) = i
end do
deallocate(data)
end program free
After compiling and running we have the following error:
% gfortran -o free free.f90
% ./free
*** glibc detected *** ./free: double free or corruption (out): 0x0000000000607590 ***
======= Backtrace: =========
/lib/libc.so.6[0x2b8d50ef0968]
/lib/libc.so.6(cfree+0x76)[0x2b8d50ef2a76]
./free[0x400859]
./free[0x4008ac]
/lib/libc.so.6(__libc_start_main+0xe6)[0x2b8d50e9b1a6]
./free[0x4006a9]
[...]
Aborted
To check invalid array indexing using the GNU Fortran compiler,
compile the program with the -fbounds-check
flag and run it
again (see gfortran(1)
for details). If any array indices are
out-of-bounds, you will see an error message like the following:
% gfortran -fbounds-check -o free free.f90
% ./free
At line 8 of file free.f90
Fortran runtime error: Array reference out of bounds for array 'data', lower bound of dimension 1 exceeded (0 < 1)
This points us directly to line 8 of free.f90
where we see that
the first iteration of the loop writes to the invalid element
data(-1)
. Changing the i-1
to i
fixes the problem.