This archive contains answers to questions sent to Unidata support through mid-2025. Note that the archive is no longer being updated. We provide the archive for reference; many of the answers presented here remain technically correct, even if somewhat outdated. For the most up-to-date information on the use of NSF Unidata software and data services, please consult the Software Documentation first.
> > Hello, > > > > I use netCDF 3.6.1 and the Fortran90 API. > > > > I run my Fortran95 code through valgrind (see http://valgrind.org) to check for memory > > leaks. I am getting the following output from valgrind when I do so: > > > > ==2560== Conditional jump or move depends on uninitialised value(s) > > ==2560== at 0x80C4E87: kill_trailing (in > > /trunk/Utility/InstrumentInfo/SRF/Test_SRF/Test_SRF) > > ==2560== by 0x80C5160: nf_inq_dim_ (in /trunk/Utility/InstrumentInfo/SRF/Test_SRF/Test_SRF) > > ==2560== by 0x80C34B5: __netcdf_MOD_nf90_inquire_dimension (in > > /trunk/Utility/InstrumentInfo/SRF/Test_SRF/Test_SRF) > > ==2560== by 0x805AD28: __srf_netcdf_io_MOD_readdim (in > > /trunk/Utility/InstrumentInfo/SRF/Test_SRF/Test_SRF) > > ==2560== by 0x805D5D3: __srf_netcdf_io_MOD_inquire_srf_netcdf (in > > /trunk/Utility/InstrumentInfo/SRF/Test_SRF/Test_SRF) > > ==2560== by 0x806098C: __srf_netcdf_io_MOD_write_srf_netcdf (in > > /trunk/Utility/InstrumentInfo/SRF/Test_SRF/Test_SRF) > > ==2560== by 0x806C5D0: MAIN__ (in /trunk/Utility/InstrumentInfo/SRF/Test_SRF/Test_SRF) > > ==2560== by 0x80E121D: main (fmain.c:21) > > ==2560== > > > > The readdim() function above is a wrapper in my netcdf I/O module that returns a dimension > > value given its name: > > > > FUNCTION ReadDim( NC_FileId,DimName,DimValue ) RESULT( Error_Status ) > > ! Arguments > > INTEGER, INTENT(IN) :: NC_FileId > > CHARACTER(*), INTENT(IN) :: DimName > > INTEGER, INTENT(OUT) :: DimValue > > ! Function result > > INTEGER :: Error_Status > > ! Local variables > > INTEGER :: NF90_Status > > INTEGER :: id > > ! Setup > > Error_Status = SUCCESS > > ! Get the dimension id > > NF90_Status = NF90_INQ_DIMID( NC_FileId,TRIM(DimName),id ) > > IF ( NF90_Status /= NF90_NOERR ) THEN > > <snip error handling> > > RETURN > > END IF > > ! Get the dimension value > > NF90_Status = NF90_INQUIRE_DIMENSION( NC_FileId,id,Len=DimValue ) > > IF ( NF90_Status /= NF90_NOERR ) THEN > > <snip error handling> > > RETURN > > END IF > > END FUNCTION ReadDim > > > > > > The only reference to kill_trailing I could find is in cfortran.h (shown below) > > > > > > /* kill the trailing char t's in string s. */ > > #ifndef __CF__KnR > > static char *kill_trailing(char *s, char t) > > #else > > static char *kill_trailing( s, t) char *s; char t; > > #endif > > {char *e; > > e = s + strlen(s); > > if (e>s) { /* Need this to handle NULL string.*/ > > while (e>s && *--e==t); /* Don't follow t's past beginning. */ > > e[*e==t?0:1] = '\0'; /* Handle s[0]=t correctly. */ > > } return s; } > > > > > > I'm wondering why I am getting the kill_trailing error in reference to the > > NF90_INQUIRE_DIMENSION() call - there are no strings there to truncate (assuming I am > > understanding what kill_trailing is being used for.) I assume the nf_inq_dim translates to > > the nc_inq_dim and that somehwere along the way strings are involved. > > > > Do you have any ideas on how I can determine why I am getting this memory error? I should > > point out that the program results are correct - it's just the output from valgrind that > > indicates any sort of problem. > > > > cheers, > > > > paulv > > > > > > p.s. I compiled the netcdf libraries using gfortran > > > > $ gfortran --version > > GNU Fortran (GCC) 4.4.0 20080302 (experimental) [trunk revision 132813] > > > > with the flags > > > > export CC=/usr/bin/gcc > > export CPPFLAGS='-DNDEBUG -DpgiFortran' > > export CFLAGS=-O > > export FC=gfortran > > export F90=gfortran > > export FFLAGS=-fno-second-underscore > > export F90FLAGS=-fno-second-underscore > > export CXX=/usr/bin/g++ > > > > > Howdy Paul! As you have noted, kill_trailing is part of cfortran.h. The cfortran.h package is not a Unidata package, it is a tool we use to expose the C API to fortran 77 users. (And F90 users, since the F90 API calls the F77 API). So this is not our code, and we generally shy away from modifications to it. You should also know that as soon as we can (sometime in the next two years, I hope), we plan to take advantage of the Fortran 2003 standard API for calling C functions, at which point cfortran will be obsolete and eventually removed. The reason kill_trailing is being called is that the nf_inq_dim function does include a string, the name of the dimension. The kill_trailing is necessary to deal with the null terminators C puts (and needs) for strings. I don't know what in the kill_trailing function is causing the uninitialized value warning from valgrind. Seems to be that all the values are initialized. If you want to mess with it, change the function in cfortran.h and then do a make clean all to rebuild the fortran APIs. Thanks, Ed Ticket Details =================== Ticket ID: EBD-881732 Department: Support netCDF Priority: Normal Status: Closed