【发布时间】:2020-03-13 15:32:44
【问题描述】:
我的代码很复杂,但以下 MWE Fortran 程序显示了该问题并导致 Intel Fortran 18.0.5 中出现分段错误。
forrtl: severe (174): SIGSEGV, segmentation fault occurred
回溯显示在调用 NN= malloc(nsize) 的 malloc() 期间出现问题
它还会导致 gfortran 出现以下错误
./a.out: free(): invalid next size (fast): 0x0000000000603b40 ***
源码为:
program test
c this program tests memory allocation
read(*,*)k
call test_cray(k)
end
subroutine test_cray(k)
#ifdef BIT64
integer*8 NN, nsize
#endif
real x(*)
real*8 prob(k,k, 128, 128)
real*8 prob1(k,k, 128, 128)
real*8 prob2(k,k, 128, 128)
pointer(NN , x)
nsize = k*4*128*128
nsize =20
NN= malloc(nsize)
do i =1, 20
x(i)=0.1*(i-1)
end do
NN =loc(x)
write(*,*) NN
!write(*,*) "shape of x=", shape(x)
call shape_cray(NN)
write(*,*)"shape_cray returned"
end
subroutine shape_cray(NN )
real y
pointer(nx , y)
do i =1, 20
nx = NN + (i-1)*4
write(*,*)nx, y
end do
write(*,*) NN
write(*,*) "shape of y=", shape(y)
write(*,*) "y=", y
end
请注意,程序中的空格必须针对降价进行调整。没有分段错误的正确方法是什么?
这是输出:
prompt> ifort -g -O0 -traceback -DBIT64 -mcmodel=large cray_test1.F
prompt> ./a.out
128
forrtl: severe (174): SIGSEGV, segmentation fault occurred
Image PC Routine Line Source
libifcoremt.so.5 00007F70F617F49C for__signal_handl Unknown Unknown
libpthread-2.12.s 00000034A2C0F790 Unknown Unknown Unknown
a.out 0000000000400C3B test_cray_ 19 cray_test1.F
a.out 000000000040097D MAIN__ 5 cray_test1.F
a.out 00000000004008CE Unknown Unknown Unknown
libc-2.12.so 00000034A241ED5D __libc_start_main Unknown Unknown
a.out 00000000004007D9 Unknown Unknown Unknown
我用k=120。
【问题讨论】:
-
有什么理由不能使用标准的 Fortran 来执行此操作吗?可分配数组比您尝试使用的过时的、非标准的东西要容易得多。
-
那么 complete 输出是什么?它停在哪里?您仍然打印哪些行?
NN =loc(x)的目的是什么? -
@IanBush 我正在尝试改进手动管理内存的旧代码。为了制作 F90,我需要更改太多代码并且之前失败并放弃了
-
@VladimirF loc(x) 检索 x 的地址。我将添加输出。也许像你这样的专家可以解释发生了什么
-
尝试使用 -Wall 和 gfortran 编译您的代码。一旦你修复了警告/错误。你可能会有更好的运气得到你想要的结果。作为额外的奖励,您犯了隐式类型的主要罪行。添加
IMPLICIT NONE。