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?

questionAnswers(2)

yourAnswerToTheQuestion