Fortran函数引用与赋值的冲突及代码标准合规性问询
Fortran代码合规性求证
背景:存在别名问题的无效代码
以下代码因别名冲突违反Fortran标准:
program main integer :: x, y ! compilers assume a and b to be distinct y = f(x, x) contains integer function f(a, b) result(c) integer, intent(in out) :: a, b a = 1 b = 2 c = a ! compiler can optimize to c = 1 end function end program main
问题核心:调用f(x,x)时,同一实参x同时绑定到两个intent(in out)形参a和b。Fortran标准允许编译器假定in/out形参指向独立内存区域,此类别名会导致优化后逻辑错误,因此代码无效。
待验证代码
需确认以下代码是否符合Fortran标准(该代码可在gfortran中运行):
program main integer :: x(3) x = [1, 2, 3] x = square_me(x) contains function square_me(a) result(squared) integer, intent(in out) :: a(3) integer :: squared(3) squared = a ** 2 a(1) = 0 ! nasty side-effect end function end program main
注:已知函数副作用并非良好实践,但因处理超10万行遗留代码,仅针对标准合规性求证。
结论:符合Fortran标准
这段代码完全符合Fortran标准,理由如下:
- 不存在违反别名规则的情况:调用
square_me(x)时,仅实参x与形参a绑定,函数结果squared是独立的局部数组,未与a(或实参x)形成别名; - Fortran标准并未禁止函数存在副作用,仅不推荐此类降低代码可维护性的写法;
- 代码执行逻辑符合标准规范:函数调用时先计算结果
squared,再将其赋值给x,函数内部对a的修改属于副作用,但未违反标准约束。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

