debugging - Valgrind 在 Fortran 代码中显示未初始化的变量

我正在 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

我在这里错过了什么?

最佳答案

在阅读了 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 中您可以通过名称开头的字母隐式声明变量类型,很难将其中一个变量声明为静态(或根本不明确声明)。

https://stackoverflow.com/questions/7652937/

相关文章:

sql-server - 获取表列的创建日期

xml - 如何使用受控词汇表或分类法来定义 XML 元素名称或属性名称?

.net - 如何获取 ASMX 生成的 WSDL soap :address to use htt

interface-builder - 如何将 "turn off"透明度从 UIView 继承到

ruby-on-rails - rails 不见了

visual-studio - 更改远程桌面键盘快捷方式

visual-studio-2010 - Intellisense 将 .c 文件视为 .cpp

sql-server - sql server 中的语言环境感知排序

asp.net - 提交按钮间歇性地在 Chrome 中不执行任何操作

pdf - 打印时将空白页插入 PDF