2

这是一个简短的问题,但我试图提供尽可能多的细节。

我正在 Scientific Linux 上编译一个旧的但仍在积极开发的 fortran 代码(f77 标准)。此代码的推荐编译器是 ifort 和 gfortran。使用 gfortran 我可以编译和运行这段代码。但是,如果我使用 DEBUG=1 标志进行代码编译,但会以 SEG FAULT 终止。使用 gdb 单步执行会导致以下错误来源:

REAL*4 TIME_CURRENT     
CALL CPU_TIME(TIME_CURRENT) 
ISECS = 100*INT(TIME_CURRENT)  

该程序终止于:

Program received signal SIGFPE, Arithmetic exception. 
timer (init=1, isecs=0) at myprog.f:1818
1818 ISECS = 100*INT(TIME_CURRENT)

如果我在第 1818 行停止执行并检查 ISECS 和 TIME_CURRENT,我会得到:

(gdb) ptype(TIME_CURRENT)
type = real(kind=4)
(gdb) ptype(ISECS)
type = integer(kind=4)

我尝试过更具体并使用:

ISECS = 100*INT(TIME_CURRENT,4)

但这无济于事。我看不出这怎么可能等同于算术错误?

我的(生成的makefile)调试编译标志是:

gfortran -fno-automatic -m32 -O0 -g \
         -ffpe-trap=invalid,zero,overflow,underflow,precision -static-libgfortran

当我从调试中编译时,我不再收到 SEG FAULT 但我的编译标志是

gfortran -fno-automatic -m32 -O2 -ffast-math -static-libgfortran

我不是 Fortran 程序员,因此我们将不胜感激。请注意,我在 64 位系统上编译,但强制进行 32 位编译,因为这是必需的。

4

1 回答 1

9

您的代码看起来不像 FORTRAN 77,CPU_TIME而是来自 Fortran 95。无论如何,您的调试选项非常严格。-ffpe-trap=invalid,zero,overflow,underflow,precision意味着浮点运算的许多合法使用将导致异常。我建议只使用-ffpe-trap=invalid,zero,overflow.

特别来自 gfortran 手册:

Some of the routines in the Fortran runtime library, like CPU_TIME ,
are likely to trigger floating point exceptions when "ffpe-trap=precision"
is used. For this reason, the use of "ffpe-trap=precision" is not recommended.
于 2013-04-22T12:30:54.573 回答