You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何访问长度为0的数组索引未触发越界访问错误?

Intel Fortran oneAPI 空数组越界未触发运行时检查的原因

问题场景

使用Intel Fortran oneAPI 2023.0.0.25839版本,已通过/check:all开启全部运行时检查:

  • 运行以下代码时,会抛出下标越界错误:
Program Main
    implicit none
    real, dimension(:), allocatable :: a
    allocate(a(1))
    print *, a(2)
End Program Main

错误信息:forrtl: severe (408): fort: (2): subscript #1 of the array A has a value 2 which is greater than the upper bound of 1

  • 但运行以下分配零大小数组的代码时,却未触发任何错误:
Program Main
    implicit none
    real, dimension(:), allocatable :: a
    allocate(a(0))
    print *, a(2)
End Program Main

完整编译命令行参数:

/nologo /debug:full /Od /Warn:interfaces /module:"Debug\\" /object:"Debug\\" /Fd"Debug\vc160.db" /traceback /check:all /libs:dll /threads /dbglibs /c

原因解释

这是Intel Fortran运行时检查机制的局限性导致的:

  1. 零大小数组的特殊处理:当数组被分配为零大小(allocate(a(0)))时,其数组上下界满足lbound(a) > ubound(a),运行时检查模块会将这类数组视为"空数组",直接跳过下标合法性验证逻辑。
  2. 边界检查的覆盖范围:/check:all包含的运行时检查主要针对非空数组的下标有效性,对于零大小数组的越界访问,当前版本的检查机制没有做针对性的捕获处理。
  3. 本质仍是未定义行为:尽管未触发错误,但访问零大小数组的下标2依然属于未定义行为,后续版本的编译器可能会修复这个检查疏漏,但当前版本下无法通过/check:all检测到这类问题。

内容的提问来源于stack exchange,提问作者TrippLamb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 15:28:20