[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[netCDF #EBD-881732]: kill_trailing problem(?) when running



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