为什么访问长度为 0 的索引数组不会引发越界访问冲突错误?

Why does accessing an index of 0 length array not throw an out of bounds access violation error?

提问人:TrippLamb 提问时间:9/29/2023 最后编辑:TrippLamb 更新时间:9/29/2023 访问量:67

问:

使用 intel fortran oneapi 版本 2023.0.0.25839。我已经使用 /check:all 打开了所有运行时检查。

如果以下抛出“forrtl: severe (408): fort: (2): subscript #1 of the array A has a value 2 which is greater the upper bound of 1” 错误:

Program Main

    implicit none

    real, dimension(:), allocatable :: a
    allocate(a(1))

    print *, a(2)

End Program Main

那么为什么这段代码不也会抛出错误:

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
阵列 Fortran Intel-Fortran

评论

3赞 Vladimir F Героям слава 9/29/2023
可能只是编译器中边界检查器中的一个错误。通过通常的渠道向供应商报告。
0赞 Ian Bush 9/29/2023
有趣的是,当第二个程序编译时,WSL 中 Ubuntu 20.04.6 上的 ifx 2023.2.0 20230721 也无法给出越界错误。但是,ifx 在打印零后退出时确实会给出未初始化的变量错误。Ifort 的行为如上所述。顺便说一句,对这个问题的改进是编辑它以包含确切的编译行,假设您使用的是命令行。我也假设是某个版本的 Windows。ifx -check all
0赞 TrippLamb 9/29/2023
不使用命令行,但我可以从 Visual Studio 添加命令选项。
0赞 Vladimir F Героям слава 9/30/2023
真的,我们真的没有什么可以回答的。编译器开发人员必须对其进行整理。
0赞 TrippLamb 9/30/2023
很公平。对我来说,答案是它不是预期的 Fortran 行为,它是一个错误。如果有人想发布它,那么我会接受它。

答: 暂无答案