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:
O erro foi obtido com o seguinte programa:
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:
Se compilarmos o programa exemplo usando
então o compilador jogará uma mensagem acusando erros desse tipo:
Menos dor de cabeça pra nós, assim...
*** 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
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)
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:
Postar um comentário