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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 20:42:56