Alocação automática de matriz mediante atribuição no Fortran
Recentemente, descobrimos que estávamos fazendo uma atribuição a uma matriz não alocada no Fortran. O compilador GNU gfortran não capturou o erro e o código é executado no OSX e no Linux. No entanto, a mesma segmentação de código falha em um IBM Power PC.
Minha pergunta é: o código a seguir está correto? Parece que a matriz atribuída aarray
está alocando memória automaticamente, em algumas arquiteturas, mas não em outras. Existem detalhes específicos da implementação em ação aqui?
O código é um código C / Fortran misto:
#include <stdlib.h>
void assign_array_(double x[], int* n);
void print_array_();
int main()
{
int n,i;
double *x;
n = 5;
x = (double*) malloc(sizeof(double)*n);
for (i = 0; i < n; i++)
x[i] = (double) i;
assign_array_(x,&n);
print_array_();
return 0;
}
E o código Fortran:
MODULE test_mod
DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: array
integer :: nsize
END MODULE test_mod
SUBROUTINE assign_array(x,n)
USE test_mod
IMPLICIT NONE
INTEGER :: n
DOUBLE PRECISION :: x(n)
CALL test_allocated()
array = x
CALL test_allocated()
nsize = n
END SUBROUTINE assign_array
SUBROUTINE print_array()
USE test_mod, ONLY: nsize, array
IMPLICIT NONE
INTEGER :: i
DO i = 1,nsize
WRITE(6,'(F24.16)') array(i)
END DO
END SUBROUTINE print_array
SUBROUTINE test_allocated()
USE test_mod
IMPLICIT NONE
IF (ALLOCATED(array)) THEN
WRITE(6,*) 'Array is allocated'
WRITE(6,*) 'size is ', SIZE(array)
ELSE
WRITE(6,*) 'Array is NOT allocated'
END IF
END SUBROUTINE test_allocated
A saída (quando executada) é:
Array is NOT allocated
Array is allocated
size is 5
0.0000000000000000
1.0000000000000000
2.0000000000000000
3.0000000000000000
4.0000000000000000
E aqui está a saída no Power PC:
Array is NOT allocated
Segmentation fault (core dumped)
Em resumo: Ele é executado quando compilado no GNU (GNU Fortran (MacPorts gcc5 5.4.0_0) 5.4.0) gfortran no OSX (arch: x86_64h) e Linux (em uma máquina virtual hospedada no OSX, GNU Fortran (Ubuntu 4.9.4- 2ubuntu1 ~ 14.04.1) 4.9.4), mas falha ao ser executado quando compilado no Power PC (arch: ppc64) compilado usando o GNU Fortran (GCC) 4.4.7 20120313 (Red Hat 4.4.7-17). Em nosso código original, a implementação do Power PC apenas foi falhada muito mais tarde no código, onde as entradas atribuídas ao array foram referenciadas, tornando nosso 'bug' (se é realmente um bug) realmente difícil de rastrear.
Qual é o comportamento correto para o código acima?