我最近开发了一个相当长的Fortran代码。 我正在使用的编译器是Opentuse 13.1(64位)上的gfortran 4.8.1。 但是当我用-O2或-O3选项编译代码时,我得到了许多有关“-Wmaybe-uninitialized”的警告。 我设法减less代码到一个最小的工作示例,如下所示。
在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
在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
在全球.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
使用gfortran -O2 -Wall test.f90 main.f90 -o run
编译时,会出现以下警告:
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]
虽然我试图谷歌这个问题一段时间,我仍然没有find一个好的答案。 一些相关网站是:(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-未初始化的问题
我使用gfortran 4.8.5testing了示例代码,警告仍然存在。 是因为我在代码中做了什么错误? 任何帮助将不胜感激。 提前致谢!
因为在cosMphi
的分配中使用stat=ALLOCATESTATUS
,但是之后不检查状态变量的值。 只是省略了。 那么如果分配失败,程序将崩溃 – 这是简单的方法,除非您需要更强大/更复杂的响应。
同意MSB的回答,警告信息有点不清楚。 这是NAG Fortran编译器必须说的:
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]