【问题标题】:segmentation fault created by fortran if testsfortran if 测试创建的分段错误
【发布时间】:2012-03-25 10:49:58
【问题描述】:

假设我有以下代码

    IF (a.eq.0.or.M(a)) THEN

使用一个整数和 M(1:3) 一个逻辑数组。 如果 a 等于 0,那么我希望第一个测试能够捕获它,而第二个测试永远不会被评估。但是,如果我使用 intel fortran 编译器并使用

进行编译
    -check all

然后我遇到了分段错误。没有此调试选项不会发生错误。 这是标准行为吗?对于许多语言,手册中明确指出对于

    IF (A.or.B) THEN

如果 A 为真,则不评估 B。 Fortran 标准是否明确要求即使不影响最终结果也可以评估 A 和 B?

【问题讨论】:

  • 在使用下标检查的编译器选项时从越界下标中获取分段错误——我将其称为下标检查实现中的错误。

标签: debugging if-statement segmentation-fault fortran


【解决方案1】:

Fortran allows for, but does not guarantee, short-circuit evaluation of logical operators。因此,为了安全起见,您必须在假设每个操作数都被评估的情况下编写代码。

【讨论】:

  • +1,语言规范不保证短路。 Compaq/DEC 支持它,Intel 不支持,我无法与其他编译器交谈。
  • @sixlettervariables:感谢您的验证!
  • @user7116 这已被 Steve Lionel 拒绝,例如在 this thread 中。 DVF、CVF 和 IVF 都不能保证按从左到右的顺序进行评估,因此短路评估,即使由优化器实现,也不能在这种情况下使用。
  • @user7116 有趣的是,自 VAX Fortran 以来,文档并没有太大变化:VAX p.94、CVF p.102 和 IVF p.809
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-19
  • 2017-10-25
  • 1970-01-01
  • 2023-02-07
  • 2015-01-08
相关资源
最近更新 更多