Kompilator GNU Fortran w podsystemie Windows dla systemu Linux - błąd segmentacji z przekazaniem funkcji wewnętrznej do innej procedury [duplikat]

Nov 29 2020

Uważam, że poniższy program jest prawidłowym programem Fortran 2008 i działa dobrze na oryginalnych systemach operacyjnych macOS, Linux i Windows z kompilatorami Intel i 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

Jednak po skompilowaniu z GFortran w podsystemie Windows dla systemu Linux (WSL) (Ubuntu) i uruchomieniu daje następujący komunikat o błędzie 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)

Prześledziłem problem w wywołaniu funkcji wewnętrznej przez procedurę zewnętrzną. Ale ten sam kod działa dobrze na wszystkich innych systemach operacyjnych z różnymi kompilatorami Fortran. Tak więc nie wydaje się to być błędem w GNU GFortran, ale bardziej prawdopodobnym problemem ze statyczną kompilacją i wykonywaniem kodu, który zawiera zewnętrzne wywołania procedur wewnętrznych innej procedury, w szczególności w systemie WSL.

Aby udzielić więcej informacji, zauważyłem, że biblioteka działa dobrze (nawet przy wewnętrznych wywołaniach funkcji), gdy jest zbudowana jako biblioteka współdzielona. Jednak kończy się niepowodzeniem z tym samym komunikatem o błędzie podczas kompilowania biblioteki statycznej.

Wygląda więc na to, że kombinacja niektórych flag GFortran może w jakiś sposób rozwiązać błąd ( -fPIC -shared). Każda pomoc dotycząca rozwiązania tego problemu jest bardzo mile widziana.

Odpowiedzi

3 Rob Nov 30 2020 at 09:25

Jako osoba z problemem w Segmentation fault podczas przekazywania funkcji wewnętrznej jako argumentu znalazłem przejście do WSL w wersji 2 rozwiązuje problem za mnie.