Компилятор GNU Fortran в подсистеме Windows для Linux - Ошибка сегментации с передачей внутренней функции другой процедуре [дубликат]

Nov 29 2020

Я считаю, что приведенная ниже программа является действующей программой Fortran 2008, и она отлично работает в подлинных операционных системах macOS, Linux и Windows с компиляторами Intel и 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

Однако при компиляции с помощью GFortran в подсистеме Windows для Linux (WSL) (Ubuntu) и запуске он выдает следующее сообщение об ошибке 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)

Я проследил проблему до вызова внутренней функции внешней процедурой. Но тот же код отлично работает во всех других операционных системах с разными компиляторами Fortran. Таким образом, это не похоже на ошибку GNU GFortran, а скорее проблема со статической компиляцией и выполнением кода, который содержит внешние вызовы внутренних процедур другой процедуры, в частности, в ОС WSL.

Чтобы предоставить дополнительную информацию, я заметил, что библиотека работает нормально (даже с внутренними вызовами функций), когда она построена как общая библиотека. Однако при компиляции статической библиотеки возникает то же сообщение об ошибке.

Итак, похоже, что комбинация некоторых флагов GFortran может каким-то образом разрешить ошибку ( -fPIC -shared). Любая помощь в решении этой проблемы приветствуется.

Ответы

3 Rob Nov 30 2020 at 09:25

Как человек, у которого возникла проблема с ошибкой сегментации при передаче внутренней функции в качестве аргумента, я обнаружил, что переход на WSL версии 2 решает эту проблему для меня.