在这个最小的例子中,是否允许传递 的可选虚拟参数可能不是对应的可选虚拟参数的y
实际参数?test_wrapper
present
y
test
program main
implicit none
real :: x = 5.0
call test_wrapper(x)
contains
subroutine test_wrapper(x, y)
implicit none
real, intent(in) :: x
real, dimension(:), intent(out), optional :: y
call test(x, y)
end subroutine test_wrapper
subroutine test(x, y)
implicit none
real, intent(in) :: x
real, dimension(:), intent(out), optional :: y
if (present(y)) then
y = x
end if
end subroutine test
end program
UndefinedBehaviourSanitizer 报错,说明不是:https ://godbolt.org/z/nKj1h6G9r
在这个 Fortran 标准文档(第 311 页的第 15.5.2.12 节,“参数存在和参数不存在的限制”)中,它说:
- 不存在的可选虚拟参数受以下限制。
- 如果是数据对象,则不应被引用或定义。如果它是具有默认初始化的类型,则初始化无效。
- [...]
- [...]
- [...]
- 不应将其作为基础对象并带有一个或多个子对象选择器的指示符作为实际参数提供。
- [...]
- 如果它是一个指针,则它不应被分配、解除分配、无效化、指针分配或作为对应于可选非指针虚拟参数的实际参数提供。
- 如果它是可分配的,则不应分配、解除分配或作为与可选的不可分配伪参数相对应的实际参数提供。
- [...]
- 除非在上面的列表中注明,它可以作为与可选的虚拟参数相对应的实际参数提供,然后也被认为不存在。
我正在努力阅读该列表中的标准,所以也许其中一个我不完全理解的项目禁止使用假定形状的数组?但在我看来,这些限制都不适用于这种情况。
但有趣的是,UBSan 似乎只在使用 时引发错误dimension(:)
,即如果y
是假设形状的数组。其他任何东西dimension(2)
,如dimension(n)
添加大小参数n
,allocatable
或pointer
什么都没有似乎不会触发 UBSan。