Compilateur GNU Fortran sur le sous-système Windows pour Linux - Erreur de segmentation avec passage d'une fonction interne à une autre procédure [dupliquer]

Nov 29 2020

Je crois que ce qui suit est un programme Fortran 2008 valide et qu'il fonctionne très bien sur les systèmes d'exploitation macOS, Linux et Windows authentiques avec les compilateurs Intel et 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

Cependant, lorsqu'il est compilé avec GFortran sur un sous-système Windows pour Linux (WSL) (Ubuntu) et exécuté, il donne le message d'erreur SegFault suivant:

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)

J'ai retracé le problème jusqu'à l'appel de fonction interne par la procédure externe. Mais le même code fonctionne correctement sur tous les autres systèmes d'exploitation avec différents compilateurs Fortran. Donc, cela ne semble pas être un bogue avec GNU GFortran, mais plus probablement un problème avec la compilation statique et l'exécution de code qui contient des appels externes aux procédures internes d'une autre procédure, en particulier, sur WSL OS.

Pour donner plus d'informations, j'ai remarqué que la bibliothèque fonctionne correctement (même avec des appels de fonction internes) lorsqu'elle est construite en tant que bibliothèque partagée. Cependant, il échoue avec le même message d'erreur lors de la compilation d'une bibliothèque statique.

Ainsi, il semble qu'une combinaison de certains indicateurs GFortran puisse en quelque sorte résoudre l'erreur ( -fPIC -shared). Toute aide sur la façon de résoudre ce problème est grandement appréciée.

Réponses

3 Rob Nov 30 2020 at 09:25

En tant que personne ayant le problème dans la segmentation faute lors du passage de la fonction interne comme argument, j'ai trouvé que le passage à la version 2 de WSL résout le problème pour moi.