Compilador GNU Fortran no subsistema Windows para Linux - falha de segmentação ao passar função interna para outro procedimento [duplicado]
Acredito que o seguinte é um programa Fortran 2008 válido e funciona bem em macOS, Linux e sistemas operacionais Windows genuínos com compiladores Intel e GNU Fortran.
module InternalFuncCaller_mod
implicit none
abstract interface
function getInternalFunc_proc(input) result(output)
implicit none
real, intent(in) :: input
real :: output
end function getInternalFunc_proc
end interface
contains
subroutine callInternalFunc(getInternalFunc, x)
implicit none
procedure(getInternalFunc_proc) :: getInternalFunc
real, intent(in) :: x
write(*,*) getInternalFunc(x)
end subroutine callInternalFunc
end module InternalFuncCaller_mod
module InternalFunc_mod
implicit none
contains
subroutine passInternalFunc()
use InternalFuncCaller_mod, only: callInternalFunc
implicit none
call callInternalFunc(getThisInternalFunc, x = 4.)
contains
function getThisInternalFunc(x) result(sqrtx)
implicit none
real, intent(in) :: x
real :: sqrtx
sqrtx = sqrt(x)
end function getThisInternalFunc
end subroutine passInternalFunc
end module InternalFunc_mod
program testInternalFuncCall
use InternalFunc_mod
implicit none
call passInternalFunc()
write(*,*) "Done."
end program testInternalFuncCall
No entanto, quando compilado com GFortran em um subsistema Windows para Linux (WSL) (Ubuntu) e executado, ele fornece a seguinte mensagem de erro SegFault:
Program received signal SIGSEGV: Segmentation fault - invalid memory reference.
Backtrace for this error:
#0 0x7ffb84580d3a
#1 0x7ffb8457fed5
#2 0x7ffb843a620f
#3 0x7fffde946cb0
Segmentation fault (core dumped)
Rastreei o problema até a chamada de função interna pelo procedimento externo. Mas o mesmo código funciona bem em todos os outros sistemas operacionais com diferentes compiladores Fortran. Portanto, isso não parece ser um bug com GNU GFortran, mas mais provavelmente um problema com a compilação estática e execução de código que contém chamadas externas para procedimentos internos de outro procedimento, em particular, no WSL OS.
Para dar mais informações, percebi que a biblioteca funciona bem (mesmo com chamadas de funções internas) quando é construída como uma biblioteca compartilhada. No entanto, ele falha com a mesma mensagem de erro quando compilada uma biblioteca estática.
Portanto, parece que uma combinação de alguns sinalizadores GFortran pode de alguma forma resolver o erro ( -fPIC -shared
). Qualquer ajuda sobre como resolver este problema é muito apreciada.
Respostas
Como a pessoa com o problema de falha de segmentação ao passar função interna como argumento , descobri que mudar para o WSL versão 2 corrige o problema para mim.