将第二行打印到文件时,valgrind会出错

时间:2013-05-14 12:46:50

标签: valgrind system-calls writetofile fortran95

我正在使用valgrind来查找代码中的错误。我使用的命令是

 valgrind --leak-check=yes ./a.out

我只用-g代码编译代码。我得到许多指向单个写行的错误(三个打印值被初始化并且定义良好)。

write (22,*) avlength, stdlength, avenergy

全部出现Conditional jump or move depends on uninitialised value(s)错误。所述行是从一堆行打印到单个文件的第二行。在错误结束时,我又得到两个,一个指向打开文件的行

resStep = int(conf*100/iterate)
               if (resStep.lt.10) then
                  write (resFile, "(A5,I1)") "res00",resStep
               elseif (ResStep.lt.100) then
                  write (resFile, "(A4,I2)") "res0",resStep
               else 
                  write (resFile, "(A3,I1)") "res",resStep
               endif
               open (unit=22,file=trim(resFile),status='replace', 
     c                 action='write')

resStep是整数。错误是Syscall param write(buf) points to uninitialised byte(s)。最后,当我刷新文件(关闭它之前)时,我收到错误Address 0x52d83f4 is 212 bytes inside a block of size 8,344 alloc'd

我在这里找不到任何逻辑。如果问题是以错误的方式打开文件,我不会在第一行得到错误吗?

我使用f95编译它,我的gcc版本是4.1.2。我不能升级任何一个。

1 个答案:

答案 0 :(得分:0)

狂野猜测:检查resFile的数据类型。它是字符串还是单元号?

我的Fortran 95已经过时了但是在调用 write()之前尝试将调用移到 open()并传递一个整数 resUnit 而不是 resFile 作为 write()的第一个参数:

CHARACTER(LEN=20):: resFile
INTEGER(KIND=2)  :: resUnit, resStep

resStep = 1
resFile = 'MY-results'
resUnit = 22
open (unit=resUnit, file=trim(resFile), status='replace', action='write')
write(resUnit, "(A5,I1)") "res00", resStep

END