无法抑制绑定检查

时间:2016-09-16 15:13:19

标签: gcc fortran compiler-warnings gfortran compiler-flags

首先,我不知道使用gfortran时绑定检查是自动的。使用以下代码:

gfortran -Wno-array-bounds initial_parameters.f08 derrived_types.f08 lin_alg.f08 constitutive_models.f08 input_subs.f08 Subprograms.f08 mainprog.f08 

我仍然收到编译时警告:

Warning: Array reference at (1) is out of bounds (3 > 2) in dimension 2

我可能在这里很傻但是从阅读this,我认为-Wno-array-bounds应该压制这个警告?使用-w进行编译会成功禁止所有警告。

我不知道它是否相关,但这些警告的来源是" Subprograms.f08"和" constitutive_models.f08"这两个模块都包含子程序,并在主程序中使用。

如果我尝试使用

编译单个模块,则会出现相同的行为
gfortran -Wno-array-bounds -c constitutive_models.f08 

2 个答案:

答案 0 :(得分:3)

我可以使用这个简单的代码用gfortran(4.4)确认编译 警告

 integer,parameter::dim=3
 integer :: x(2)
 if(dim.eq.1)write(*,*)x(dim)
 end
  

警告:(1)处的数组引用超出范围2(3> 2)

这可能被认为是一个错误,因为人们会期望编译器优化整个if语句。注意ifort编译就好了。

一个非常简单的解决方法修复了这个例子:

 integer,parameter::dim=3
 integer :: x(2),dimx=dim
 if(dim.eq.1)write(*,*)x(dimx)
 end

当然,因为它只是一个警告,你知道它不是问题,你也可以选择忽略它!

请注意在逻辑中使用参数,以防编译器感觉稍后要对其进行优化。

答案 1 :(得分:2)

所以我可能建议使用重载子程序来处理数据 - 然后你就会有通用行为,而不需要将维度参数显式地传递给函数(从而摆脱警告)。然后我建议你遵循Holmz的建议,即在测试阶段使用所有警告,然后在生产构建期间完全关闭它们(-w)。现在我无法找到一种有效的方法来抑制此警告(除了-w) - 似乎默认情况下检查数组边界并且不会覆盖-fno-bounds-check或-Wno-array -bounds。但是重载函数可以更好地解决您的问题,在这种情况下实现应该如下所示:

module functions

    implicit none

    interface test_dim
        module procedure test_func1d, test_func2d, test_func3d
    end interface ! test_dim

    contains

    subroutine test_func1d(input1d)
        real, intent(in) :: input1d(:)

        print*, "DOING 1 DIM"
        print*, "SHAPE OF ARRAY:", shape(input1d)
    end subroutine test_func1d

    subroutine test_func2d(input2d)
        real, intent(in) :: input2d(:,:)

        print*, "DOING 2 DIM"
        print*, "SHAPE OF ARRAY:", shape(input2d)
    end subroutine test_func2d

    subroutine test_func3d(input3d)
        real, intent(in) :: input3d(:,:,:)

        print*, "DOING 3 DIM"
        print*, "SHAPE OF ARRAY:", shape(input3d)
    end subroutine test_func3d

end module functions

program test_prog
    use functions

    implicit none

    real :: case1(10), case2(20,10), case3(30, 40, 20)

    call test_dim(case1)
    call test_dim(case2)
    call test_dim(case3)
end program test_prog

此函数产生的输出如下所示:

 DOING 1 DIM
 SHAPE OF ARRAY:          10
 DOING 2 DIM
 SHAPE OF ARRAY:          20          10
 DOING 3 DIM
 SHAPE OF ARRAY:          30          40          20