【问题标题】:ifort and out of bound Index - Odd Behaviourifort 和超出范围的索引 - 奇怪的行为
【发布时间】:2016-02-24 11:25:07
【问题描述】:

最近我恢复了 Fortran,可能我缺少一些东西,但这种行为看起来很奇怪

当我运行以下代码(使用 ifort 编译)时,它只是声明了一个数组并设置了他的元素之一

PROGRAM sol_kernel2

IMPLICIT NONE

INTEGER, PARAMETER :: jpi=5,jpj=5
REAL, DIMENSION(jpi,jpj) :: sshn  
PRINT *,jpi,jpj

sshn(10,10) = 150.0
PRINT *,sshn(10,10)

END PROGRAM sol_kernel2

我希望得到一个错误语句,例如 SEGMENTATION FAULT,因为我正在尝试使用内存不足的索引来设置 sshn 变量。我得到一个像这样的无错误输出

           5           5
150.0000    

如果我尝试在代码中设置

sshn(100,100) = 150.0

我明白了

           5           5
0.0000000E+00

反正编译器也没有报错,但是这次150.0设置失败。你对此有什么提示吗?我无法弄清楚自己做错了什么。谢谢

【问题讨论】:

    标签: arrays segmentation-fault fortran range


    【解决方案1】:

    编译器不需要诊断您的越界索引。当您执行此类操作时,语言标准未指定会发生什么。它也被称为undefined behaviour

    你不能指望会发生任何特定的事情。

    如果您希望诊断错误,请使用错误检查进行编译:

       ifort -g -traceback -warn -check yourcode.f90
    

    实际发生的事情是你在内存中的某个随机位置写了一些东西。谁知道在更复杂的代码中会发生什么。然后它可能会在随机情况下崩溃或给出错误的结果。

    【讨论】:

      【解决方案2】:

      编译后的代码通常不会检查边界和越界访问。如果操作系统试图访问分配给进程的内存之外的内存,您可以预期操作系统会杀死该进程,否则它将放手。很难判断何时会发生这种情况。

      在您的情况下,您在数组边界之外设置和访问了内存-它实际上是一个内存地址,因此可以指示您的代码执行此操作-但它必须在分配给进程的内存中,并且您发现出,结果是不可预测和未定义的。

      您可以使用 ifort 强制执行严格的边界检查

      -check bounds
      

      编译器选项。这实际上会为我使用的 ifort 版本捕获此错误编译时间。即使没有任何额外的编译器标志,Gfortran 也会捕获错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-02
        • 2022-07-18
        相关资源
        最近更新 更多