Compilador GNU Fortran no subsistema Windows para Linux - falha de segmentação ao passar função interna para outro procedimento [duplicado]

Nov 29 2020

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

3 Rob Nov 30 2020 at 09:25

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.