quinta-feira, 12 de março de 2009

Fortran >> Double free or corruption erroremp

Um erro identificado como Double or Free Corruption em um programa de Fortran significa que de alguma forma a função Free() (C Runtime) foi invocada com um ponteiro inválido. Neste caso, o compilador gfortran joga na tela a seguinte mensagem:
*** glibc detected *** ./exemplo: double free or corruption (out): 0x0000000000607590 *** (...)

O erro foi obtido com o seguinte programa:
program free
integer, allocatable :: data
integer :: i

allocate(data(5)) ! aloca o vetor data
do i = 1, 5
data(i-1) = i ! medida proibida!
end do
deallocate(data) ! desaloca para fechar o programa.
end program free


Uma causa muito comum deste erro é o exemplo que acabmos de mostrar: tentar sobrescrever parte da memória que está fora do alcance do programa, tal como tentar alcançar um índice inexistente de algum vetor.

Versões mais recentes do Fortran (90, por exemplo) permitem que o usuário utilize alocação dinâmica de vetores, isto é, pode-se declarar um vetor sem necessariamente ter que definir o número de componentes (nem rank). Para facilitar, pode ser de grande valia, ao compilar seus programas, utilizar a seguinte opção:

-fbounds-check

Se compilarmos o programa exemplo usando

gfortran -fbounds-check exemplo.f90 -o exemplo

então o compilador jogará uma mensagem acusando erros desse tipo:

$ ./free
At line 6 of file free.f90
Fortran runtime error: Array reference out of bounds for array 'data', lower bound of dimension 1 exceeded (0 < 1)

Menos dor de cabeça pra nós, assim...




Nenhum comentário: