tutorial descargar compiler compilar linux gcc fortran gfortran

linux - descargar - gfortran ubuntu



Advertencias de Gfortran quejándose "Wmaybe-uninitialized" (2)

Recientemente estoy desarrollando un código Fortran bastante largo. El compilador que estoy usando es gfortran 4.8.1 en Opensuse 13.1 (64-bit). Sin embargo, cuando compilé el código con las opciones -O2 u -O3, recibí muchas advertencias sobre "-Wmaybe-uninitialized". Logré reducir el código a un ejemplo de trabajo mínimo como se muestra a continuación.

En main.f90

program main use modTest implicit none real(kind = 8), dimension(:, :), allocatable :: output real(kind = 8), dimension(:, :, :), allocatable :: input allocate(input(22, 33, 20), output(22, 33)) input = 2.0 call test(input, output) end program main

En test.f90

module modTest contains subroutine test(inputValue, outValue) use modGlobal implicit none real(kind = 8), dimension(:, :, :), intent(in) :: inputValue real(kind = 8), dimension(:, :), intent(out) :: outValue integer :: nR, nX, nM, iM, ALLOCATESTATUS real, dimension(:, :, :), allocatable :: cosMPhi nR = size(inputValue, 1) nX = size(inputValue, 2) nM = size(inputValue, 3) - 1 allocate(cosMPhi(nR, nX, 0:nM), stat=ALLOCATESTATUS) call checkStatus(ALLOCATESTATUS) do iM = 0, nM cosMPhi(:, :, iM) = cos(iM * 1.0) end do outValue = sum(inputValue * cosMPhi, 3) end subroutine end module

En global.f90

module modGlobal contains subroutine checkStatus(stat) implicit none integer, intent(in) :: stat if(stat /= 0) then print *, "allocation failed" stop end if end subroutine end module

Cuando se compila utilizando gfortran -O2 -Wall test.f90 main.f90 -o run , aparecen las siguientes advertencias:

test.f90: In function ''test'': test.f90:9:0: warning: ''cosmphi.dim[2].stride'' may be used uninitialized in this function [-Wmaybe-uninitialized] real, dimension(:, :, :), allocatable :: cosMPhi ^ test.f90:9:0: warning: ''cosmphi.dim[1].ubound'' may be used uninitialized in this function [-Wmaybe-uninitialized] test.f90:9:0: warning: ''cosmphi.dim[1].stride'' may be used uninitialized in this function [-Wmaybe-uninitialized] test.f90:9:0: warning: ''cosmphi.dim[0].ubound'' may be used uninitialized in this function [-Wmaybe-uninitialized] test.f90:9:0: warning: ''cosmphi.offset'' may be used uninitialized in this function [-Wmaybe-uninitialized]

Aunque traté de buscar en este problema por un tiempo, aún no pude encontrar una buena respuesta. Algunos sitios web relevantes son: (1) https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58410 (2) https://groups.google.com/forum/m/#!topic/comp. lang.fortran / RRYoulcSR1k (3) GCC -Wuninitialized / -Wmaybe-uninitialized issues

Probé el código de ejemplo usando gfortran 4.8.5 y las advertencias aún persisten. ¿Fue porque hice algo mal en el código? Cualquier ayuda sería muy apreciada. ¡Gracias por adelantado!


Acepte la respuesta de MSB y el mensaje de advertencia no está claro. Esto es lo que el compilador Fortran de NAG tiene que decir:

nagfor -kind=byte -c test.f90 NAG Fortran Compiler Release 6.0(Hibiya) Build 1057 Questionable: test.f90, line 20: Variable ALLOCATESTATUS set but never referenced [NAG Fortran Compiler normal termination, 1 warning]


Es porque usa stat=ALLOCATESTATUS en la asignación de cosMphi pero no verifica el valor de la variable de estado después. Solo omite eso. Entonces, si falla la asignación, el programa se bloqueará: esa es la manera más fácil, a menos que necesite una respuesta más robusta / sofisticada.