【发布时间】:2016-09-16 15:13:18
【问题描述】:
首先,我不知道在使用 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
【问题讨论】:
-
在构建 gfortran 时将 -fbounds-check 设置为默认值是不常见的。您的编译时检查是一个不同的问题,您应该在源代码中修复。
-
我没有构建 gfortran,我只是在 Ubuntu 16.04 上使用
sudo apt-get install gfortran安装了它。当然,这表明源代码一定有问题。我会尝试删除 gfortran 并重新安装它 - 这没有任何区别。 -
它可能不会在编译时抑制检查。边界检查总是很好用,除了增加运行时间。编译器和计算机现在这么快,为什么还要担心编译时间增加?
-
如果在开发过程中经常使用边界检查、初始化变量检查和未使用的变量检查。一旦您进行了单元测试,或者针对一些给出预期结果的标准运行,代码就会在没有这些检查的情况下重新编译,并确认“正确性”的最终验证。然后使用 -O2、-O3 等发布生产代码。当然希望纠正越界问题,而不仅仅是禁用边界警告。
-
我编写了一个代码,它可以在 1、2 或 3 维中工作,具体取决于包含模拟参数的模块中的规范。因此,存在取决于所选维度数量的代码分支。因此,如果选择了较低的维度,则会在编译时生成警告。例如
ELSEIF (dim==3) THEN particle_data(jj)%scnd_pk(dim-1,1) = particle_data(jj)%scnd_pk(1,dim-1)如果dim=1这会引发警告。
标签: gcc fortran compiler-warnings gfortran compiler-flags