Debugging 由fortran if测试创建的分段错误

Debugging 由fortran if测试创建的分段错误,debugging,if-statement,segmentation-fault,fortran,Debugging,If Statement,Segmentation Fault,Fortran,假设我有以下代码 IF (a.eq.0.or.M(a)) THEN 使用一个整数和一个逻辑数组M(1:3)。 如果a等于0,那么我希望第一个测试捕获它,而第二个测试永远不会被计算。但是,如果我使用英特尔fortran编译器并使用 -check all 然后我发现了一个分割错误。如果没有此调试选项,则不会发生错误。 这是一种标准行为吗?对于许多语言,手册中明确指出 IF (A.or.B) THEN 如果A为真,则不计算B。Fortran标准是否明确要求A和B即使不影响

假设我有以下代码

    IF (a.eq.0.or.M(a)) THEN
使用一个整数和一个逻辑数组M(1:3)。 如果a等于0,那么我希望第一个测试捕获它,而第二个测试永远不会被计算。但是,如果我使用英特尔fortran编译器并使用

    -check all
然后我发现了一个分割错误。如果没有此调试选项,则不会发生错误。 这是一种标准行为吗?对于许多语言,手册中明确指出

    IF (A.or.B) THEN

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

。因此,为了安全起见,您必须在假设每个操作数都经过计算的情况下编写代码。

+1,语言规范不保证短路。Compaq/DEC支持它,Intel不支持,我无法与其他编译器对话。@SixlettVariables:谢谢验证@user7116这一点已被史蒂夫·莱昂内尔(Steve Lionel)否认,例如在年。DVF、CVF和IVF都不能保证按照从左到右的顺序进行评估,因此短路评估,即使由优化器实施,在这种情况下也不可用。@user7116有趣的是,自VAX Fortran:p.94以来,文档没有太大变化,p.102和p.809在使用下标检查的编译器选项时,从越界下标中获取分段错误——我将其称为下标检查实现中的错误。