2011-10-04 1 views
2

저는 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 

소스 코드를 보면 : 다음과 같은 오류가 Valgrind의으로 표시됩니다 여기에

이 라인 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)) 

그러나, 호출 스택을 가고, 우리는 이러한 변수가 바로 판명 서브 루틴을 호출로 초기화되는 것을 볼 수 있습니다.

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) 

I는 초기화되지 않은에서 첫 번째 읽기가 수행 된 곳 Valgrind의 나를 보여주기 위해 기다리고 있었다, 그러나 그것을 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에서 이름이 시작되는 문자로 변수 유형을 내재적으로 선언 할 수 있으므로 정적 (또는 명시 적으로) 선언되지 않습니다.