Compilador GNU Fortran en el subsistema de Windows para Linux - Fallo de segmentación al pasar la función interna a otro procedimiento [duplicado]

Nov 29 2020

Creo que el siguiente es un programa Fortran 2008 válido y funciona bien en sistemas operativos macOS, Linux y Windows genuinos con compiladores Intel y 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

Sin embargo, cuando se compila con GFortran en un subsistema de Windows para Linux (WSL) (Ubuntu) y se ejecuta, aparece el siguiente mensaje de error 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)

He rastreado el problema hasta la llamada de función interna por el procedimiento externo. Pero el mismo código funciona bien en todos los demás sistemas operativos con diferentes compiladores de Fortran. Por lo tanto, esto no parece ser un error con GNU GFortran, sino más bien un problema con la compilación estática y la ejecución de código que contiene llamadas externas a procedimientos internos de otro procedimiento, en particular, en WSL OS.

Para dar más información, he notado que la biblioteca funciona bien (incluso con llamadas a funciones internas) cuando está construida como una biblioteca compartida. Sin embargo, falla con el mismo mensaje de error cuando se compila una biblioteca estática.

Entonces, parece que una combinación de algunos indicadores de GFortran puede resolver de alguna manera el error ( -fPIC -shared). Se agradece enormemente cualquier ayuda sobre cómo resolver este problema.

Respuestas

3 Rob Nov 30 2020 at 09:25

Como la persona con el problema en la falla de segmentación al pasar la función interna como argumento, descubrí que pasar a la versión 2 de WSL soluciona el problema.