2011-10-04 43 views
2

我正在Fortran應用程序上執行valgrind(使用memcheck工具)。由Valgrind的顯示 以下錯誤:Valgrind在Fortran代碼中顯示未初始化的變量

==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 

我在這裏錯過了什麼?

+0

在讀完了valgrind和memcheck之後,結果我應該更加註意這一點:未初始化的值是由堆棧分配0x805ECDC創建的:relplm_(t10_isb.f90:3402)。 變量ER和EZ似乎是從一些未初始化的變量中計算出來的(我將不得不挖掘更多來找出哪些變量)。 – Eldar

+1

你用''-Wuninitialized'標記了嗎? – steabert

+0

是的,很少有問題顯示,但不是這個特定的問題。原來,子程序RELPLM使用了一些預期爲靜態的變量,但它們不是。 – Eldar

回答

0

上的valgrind和MEMCHECK讀了之後,原來我應該更加關注這一點:

==17072== Uninitialised value was created by a stack allocation 
==17072== at 0x805ECDC: relplm_ (t10_isb.f90:3402) 

我期待Valgrind的告訴我在其中執行從初始化的第一讀,但它僅當「單元化」傳播到系統調用或條件跳轉中使用的變量時才顯示。

我的問題是,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中,你可以隱式地聲明變量類型的名稱是從它的名字開始。