我正在Fortran应用程序上执行valgrind (使用memcheck工具)。valgrind显示以下错误:
==17072== at 0x806C4A2: prove_ (t10_isb.f90:1948)
==17072== by 0x804E9F3: anal1_ (t10_isb.f90:2721)
==17072== by 0x808EECC: MAIN__ (t10_isb.f90:6)
==17072== by 0x808EF14: main (t10_isb.f90:8)
==17072== Uninitialised value was created by a stack allocation
==17072== at 0x805ECDC: relplm_ (t10_isb.f90:3402)
==17072==
==17072==
==17072== ---- Attach to debugger ? --- [Return/N/n/Y/y/C/c] ---- y查看源代码,我找不到任何可疑的东西:
这里,在1948行,使用了未初始化的变量,所以我猜它是ER或EZ:
1943 if(NIT.eq.0) then
1944 ER=ER/ekran
1945 EZ=EZ/ekran
1946 end if
1947
1948 EM=DSQRT(ER*ER+EZ*EZ)
1949 ENO=-ER*PK(IEM*9-7)+EZ*PK(IEM*9-5)
1950
1951 IF(PK(IEM*9-8).GE.0.5D0) THEN
1952 ESS=(ER*(PK(IEM*9-4)-F1)+EZ*(PK(IEM*9-6)-F2))但是,向上调用堆栈,我们可以看到这些变量被直接初始化为调用PROVE子例程。
2716
2717 CALL VECMUL(SQ,JJK,CUR,NTP)
2718
2719 ER=0.D0
2720 EZ=0.D0
2721 CALL PROVE(E0,ES1,EN2,TE,TEPR,TEMI,TEMA,RB,ZB,QS,QP,R1P,Z1P,RONAT,ROHQ,RNQ,ZNQ,QNQ,NQ,IM1,IM2,IM3,IM4,IM5,IQQ,NTP,NIT,US,NFR,NTPE,NEM,NR,KEYP,MSYS,ekran,UK,RK,ZK,ER,EZ,F1,F2)
2722
2723 NPPP=NPAOLD+1
2724 DO I=NPPP,NPA
2725 N=I-NPAOLD这里我漏掉了什么?
发布于 2011-10-06 01:20:09
在阅读了valgrind和memcheck之后,我发现我应该更多地关注这一点:
==17072== Uninitialised value was created by a stack allocation
==17072== at 0x805ECDC: relplm_ (t10_isb.f90:3402)我原以为Valgrind会告诉我第一次从未初始化的读操作是在哪里执行的,但它只在"unitializedness“传播到syscall或条件跳转中使用的变量时才显示。
我的问题是ER变量是以以下方式初始化的(不是真正的代码,结构类似,但使用伪C语言):
int relplm() {
static int a11, a12, a13, a21, a31, a32, a33;
if (value of top-left cell calculated) a11...
if (value of top-center cell calculated) a12...
if (value of top-right cell calculated) a13...
if (value of left cell calculated) a21...
if (value of right cell calculated) a23...
if (value of bottom-left cell calculated) a31...
if (value of bottom-right cell calculated) a32...
if (value of bottom-right cell calculated) a33...
if (any of the values changed) er=f(a11,a12,a13,a21,a23,a31,a32,a33)
}其中一个变量没有声明为静态变量(或者根本没有显式声明)是很困难的,因为在FORTRAN77中,您可以通过变量名称的开头字母来隐式声明变量类型。
https://stackoverflow.com/questions/7652937
复制相似问题