mirror of
https://github.com/Unidata/netcdf-c.git
synced 2024-12-27 08:49:16 +08:00
245961de00
https://github.com/Unidata/netcdf-c/issues/1168 https://github.com/Unidata/netcdf-c/issues/1163 https://github.com/Unidata/netcdf-c/issues/1162 This PR partially fixes memory leaks in the netcdf-c library, in the ncdump utility, and in some test cases. The netcdf-c library now runs memory clean with the assumption that the --disable-utilities option is used. The primary remaining problem is ncgen. Once that is fixed, I believe the netcdf-c library will run memory clean with no limitations. Notes ----------- 1. Memory checking was performed using gcc -fsanitize=address. Valgrind-based testing has yet to be performed. 2. The pnetcdf, hdf4, and examples code has not been tested. Misc. Non-leak changes 1. Make tst_diskless2 only run when netcdf4 is enabled (issue 1162) 2. Fix CmakeLists.txt to turn off logging if ENABLE_NETCDF_4 is OFF 3. Isolated all my debug scripts into a single top-level directory called debug 4. Fix some USE_NETCDF4 dependencies in nc_test and nc_test4 Makefile.am
278 lines
7.2 KiB
Plaintext
278 lines
7.2 KiB
Plaintext
#NETCDF4=1
|
|
|
|
#CURLLIB=-L/opt/csw/lib -lcurl
|
|
# for irix
|
|
#CURLLIB=/upc/share/stdinstall/local/flip/lib/libcurl.a -llber -lldap -lz
|
|
#CURLLIB=-L/opt/csw/lib -lcurl -lidn -lssl -lcrypto -llber -lldap -lnsl
|
|
#CURLINCL=-I/opt/csw/include
|
|
#RPCLIB=-lnsl
|
|
#ZLIB=-L/opt/csw/lib -lz
|
|
#TESTURL=file:///upc/share/dmh/nc/netcdf-3/ncdap_test/testdata3
|
|
VALGRIND=valgrind --leak-check=full
|
|
|
|
#NCLIB=/tmp/install/lib/libnetcdf.a
|
|
|
|
NCLIB=../liblib/.libs/libnetcdf.a
|
|
NCINCL=-I ../liblib
|
|
|
|
#OCLIB=liboc.a
|
|
#OCINCL=-I./oc
|
|
|
|
LFLAG=-L/upc/share/ed/local/${HOST}/lib
|
|
|
|
CURLLIB=-lcurl
|
|
ZLIB=-lz
|
|
#HDF5LIB=-lhdf5_hl -lhdf5
|
|
HDF5LIB=/upc/share/stdinstall/local/${HOST}/lib/libhdf5_hl.a /upc/share/stdinstall/local/${HOST}/lib/libhdf5.a
|
|
|
|
OTHERLIBS=-lm
|
|
|
|
LIBS=${NCLIB} ${LFLAG} ${CURLLIB} ${HDF5LIB} ${ZLIB} ${OTHERLIBS}
|
|
INCL=-I. -I.. -I../include ${NCINCL} ${CURLINCL}
|
|
RPATH=-Wl,-rpath,${LFLAG}
|
|
|
|
# Might want to specify a particular C compiler with flags
|
|
CC=cc
|
|
CFLAGS=-g -O0 -Wall -DHAVE_CONFIG_H
|
|
#CFLAGS=-DHAVE_CONFIG_H
|
|
|
|
GFLAGS=-g3 -O0
|
|
#############################################
|
|
|
|
TESTLIBS=${LIBS}
|
|
TESTINCL=${INCL}
|
|
|
|
##################################################
|
|
|
|
SRC=\
|
|
dapcvt.c \
|
|
dapalign.c \
|
|
dapodom.c \
|
|
getvar3.c \
|
|
ncdaperr.c \
|
|
cdf3.c \
|
|
ncdap3.c \
|
|
dapdispatch3.c \
|
|
dispatch3.c \
|
|
dapdump.c \
|
|
dapdebug.c \
|
|
daputil.c \
|
|
nchashmap.c nclist.c ncbytes.c
|
|
|
|
HDRS=\
|
|
daprename.h \
|
|
dapalign.h \
|
|
dapodom.h \
|
|
getvar3.h \
|
|
dapnc.h \
|
|
daputil.h \
|
|
dispatch3.h \
|
|
dispatchdefs3.h \
|
|
dapdispatch3.h \
|
|
ncdap3.h \
|
|
dapdebug.h \
|
|
dapdump.h \
|
|
nchashmap.c nclist.h ncbytebuffer.h
|
|
|
|
OBJ=${SRC:%.c=%.o}
|
|
|
|
ALLSRC=${SRC} ${HDRS} dap.y ce.y
|
|
|
|
EXE=main.exe
|
|
|
|
DRNOLIB=libncdap.a
|
|
|
|
##################################################
|
|
|
|
#all:: ncd octest
|
|
|
|
all: varm
|
|
|
|
##################################################
|
|
|
|
${EXE}: ${DRNOLIB} main.c
|
|
${CC} ${INCL} ${GFLAGS} -c main.c
|
|
if test -e ./libs/${DRNOLIB} ; then \
|
|
${CC} -o ${EXE} main.o ./.libs/${DRNOLIB} ./oc/.libs/${OCLIB} ${LIBS} ; \
|
|
else \
|
|
${CC} -o ${EXE} main.o ${DRNOLIB} ${OCLIB} ${LIBS} ; \
|
|
fi
|
|
|
|
${DRNOLIB}: ${OBJ}
|
|
ar r ${DRNOLIB} ${OBJ}
|
|
|
|
${OBJ}: ${SRC} ${HDRS}
|
|
${CC} ${CFLAGS} ${GFLAGS} -c ${INCL} ${SRC}
|
|
|
|
##################################################
|
|
clean::
|
|
rm -f *.o *.exe ${EXE} ${DRNOLIB}
|
|
rm -fr *.tab.c *.tab.h *.output
|
|
rm -f *.stackdump
|
|
rm -fr results
|
|
|
|
##################################################
|
|
|
|
${OCLIB}:
|
|
cp oc/${OCLIB} .
|
|
|
|
##################################################
|
|
UTILDIR=~/nc/utils
|
|
|
|
util:: ncbytes.h nclist.h nchashmap.h
|
|
|
|
ncbytes.h ncbytes.c: ${UTILDIR}/bytes_template.h ${UTILDIR}/bytes_template.c
|
|
rm -f ncbytes.h ncbytes.c
|
|
sed -e 's/<<>>/NC/g' -e 's/<>/nc/g' <${UTILDIR}/bytes_template.h >./ncbytes.h
|
|
sed -e 's/<<>>/NC/g' -e 's/<>/nc/g' <${UTILDIR}/bytes_template.c >./ncbytes.c
|
|
|
|
nclist.h nclist.c: ${UTILDIR}/list_template.h ${UTILDIR}/list_template.c
|
|
rm -f nclist.h nclist.c
|
|
sed -e 's/<<>>/NC/g' -e 's/<>/nc/g' <${UTILDIR}/list_template.h >./nclist.h
|
|
sed -e 's/<<>>/NC/g' -e 's/<>/nc/g' <${UTILDIR}/list_template.c >./nclist.c
|
|
|
|
nchashmap.h nchashmap.c: ${UTILDIR}/hashmap_template.h ${UTILDIR}/hashmap_template.c
|
|
rm -f nchashmap.h nchashmap.c
|
|
sed -e 's/<<>>/NC/g' -e 's/<>/nc/g' <${UTILDIR}/hashmap_template.h >./nchashmap.h
|
|
sed -e 's/<<>>/NC/g' -e 's/<>/nc/g' <${UTILDIR}/hashmap_template.c >./nchashmap.c
|
|
|
|
##################################################
|
|
|
|
XDRSRC=xdr.c xdr_float.c xdr_mem.c xdr_stdio.c
|
|
|
|
librpc.a: ${XDRSRC}
|
|
${CC} ${CFLAGS} ${GFLAGS} -c ${XDRSRC}
|
|
ar r librpc.a ${XDRSRC:.c=.o}
|
|
|
|
|
|
##################################################
|
|
# for f in $$OCFILES; do
|
|
|
|
makeoc::
|
|
-mkdir ./oc
|
|
rm -f ./oc/*.[chy]
|
|
for f in ${HOME}/nc/oc/*.[chy]; do base=`basename $$f` ; \
|
|
cat $$f | tr -d '\r' >./oc/$$base; done
|
|
cd ./oc; rm -f i.* apitest.* getoc.* imain.* main.*
|
|
cd ./oc; rm -f config.h dap.tab.c dap.tab.h ce.y ceparselex.*
|
|
cd ./oc; rm -f ocshadow.*
|
|
cd ./oc; rm -f octest.c
|
|
cd ./oc; rm -f ocinternal.h
|
|
sed -e 's|/[*]#undef OC_DISK_STORAGE[*]/|#undef OC_DISK_STORAGE|g' \
|
|
< ${HOME}/nc/oc/ocinternal.h | tr -d '\r' >./oc/ocinternal.h
|
|
|
|
|
|
# cd ./oc; rm -f ocdebug.h
|
|
# sed -e 's|#undef DUMPTEMP|#define DUMPTEMP|g' \
|
|
-e 's|#undef OCCATCHERROR|#define OCCATCHERROR|g' \
|
|
<${HOME}/nc/oc/ocdebug.h >./oc/ocdebug.h
|
|
|
|
# echo '#undef HAVE_RPC_XDR_H' >./oc/ocinternal.h
|
|
# echo '#define HAVE_RPC_XDR_H' >>./oc/ocinternal.h
|
|
# cat ${HOME}/nc/oc/ocdebug.h >>./oc/ocdebug.h
|
|
|
|
|
|
diffoc::
|
|
for f in /home/dmh/nc/oc/*.[chy] ; do \
|
|
x=`basename $$f|tr -d '
|
|
' ` ; \
|
|
if test "x$$x" = "xdaptab.c"; then continue ; fi ; \
|
|
if test -e oc/$$x ; then diff -qw oc/$$x $$f ; fi; \
|
|
done
|
|
for f in /home/dmh/nc/oc/*.[chy] ; do \
|
|
x=`basename $$f|tr -d '
|
|
' ` ; \
|
|
if test "x$$x" = "xdaptab.c"; then continue ; fi ; \
|
|
if test -e oc/$$x ; then \
|
|
if ! diff -qw oc/$$x $$f > /dev/null ; then \
|
|
echo diff -w oc/$$x $$f ;\
|
|
diff -w oc/$$x $$f ; \
|
|
fi; \
|
|
fi; \
|
|
done
|
|
|
|
octest::
|
|
cd oc; make -f Make0 all
|
|
cp oc/octest.exe ./octest
|
|
|
|
##################################################
|
|
TESTPARAMS=[unlimitedsequence][limit=10]
|
|
#TESTDEBUG=-d
|
|
|
|
ALLTESTS=synth1 synth2 synth3 synth4 synth5 synth6
|
|
TESTURL=file:///home/dmh/nc/netcdf-3/ncdap_test/testdata3
|
|
|
|
tests::
|
|
rm -fr results
|
|
mkdir results
|
|
for t in ${ALLTESTS} ; do (\
|
|
echo "-------------------------" ; \
|
|
echo "$${t}:" ; \
|
|
echo "-------------------------"; \
|
|
if ! ./${EXE} "${TESTPARAMS}${TESTURL}/$${t}${TESTCONS}" > results/$${t}.dmp ; then \
|
|
echo "$${t} failed"; \
|
|
fi; \
|
|
echo; \
|
|
) done
|
|
|
|
td:: ${TESTSRC} ${TEST}.c
|
|
${CC} ${CFLAGS} ${TESTINCL} ${GFLAGS} -c ${TEST}.c ${TESTSRC}
|
|
${CC} -o ${TEST}.exe ${TEST}.o ${TESTOBJ} ${TESTLIBS}
|
|
./${TEST}.exe -v ${TEST}
|
|
|
|
URL=${TESTPARAMS}${TESTURL}/${TEST}${TESTCONS}
|
|
|
|
t:: ${EXE}
|
|
${VALGRIND} ./${EXE} -v ${TESTDEBUG} "${URL}"
|
|
|
|
cpp::
|
|
rm -f junki
|
|
cc -E -DHAVE_CONFIG_H -I. -I.. -I../fortran -I../libsrc -I../libncdap/oc ${GFLAGS} drno.c >junk
|
|
|
|
##################################################
|
|
# ncd
|
|
NCDUMPC=../ncdump/dumplib.c ../ncdump/indent.c ../ncdump/ncdump.c ../ncdump/nctime.c ../ncdump/vardata.c ../ncdump/utils.c
|
|
NCDUMPH=../ncdump/cdl.h ../ncdump/dumplib.h ../ncdump/indent.h ../ncdump/isnan.h ../ncdump/ncdump.h ../ncdump/nctime.h ../ncdump/vardata.h ../ncdump/utils.h
|
|
NCDUMPOBJ=${NCDUMPC:../ncdump/%.c=%.o}
|
|
|
|
#${NCDUMPC} ${NCDUMPH} ${NCLIB}
|
|
ncd::
|
|
cd ..; make
|
|
${CC} -I.. ${CFLAGS} ${GFLAGS} -c ${INCL} ${NCDUMPC}
|
|
${CC} -o ncd ${NCDUMPOBJ} ${LIBS}
|
|
|
|
|
|
##################################################
|
|
# ncc
|
|
NCCOPYC=../ncdump/nccopy.c ../ncdump/nciter.c
|
|
NCCOPYH=
|
|
NCCOPYOBJ=${NCCOPYC:%.c=%.o}
|
|
|
|
#${NCDUMPC} ${NCDUMPH} ${NCLIB}
|
|
ncc::
|
|
cd ../libsrc; make
|
|
${CC} -I.. ${CFLAGS} ${GFLAGS} -c ${INCL} ${NCCOPYC}
|
|
${CC} -o ncc ${NCCOPYOBJ} ${NCLIB} ${CURLLIB} ${HDFLIBS} ${OTHERLIBS}
|
|
|
|
##################################################
|
|
vpt::
|
|
${CC} -g -O0 ${CFLAGS} -c ${INCL} vpt.c
|
|
${CC} -o vpt.exe vpt.o ${NCLIB} ${CURLLIB} ${HDFLIBS} ${OTHERLIBS}
|
|
date; ./vpt.exe "[compile]http://oceanwatch.pfeg.noaa.gov/opendap/GLOBEC/GLOBEC_vpt" vpt.year; date
|
|
|
|
##################################################
|
|
#T=test_varm3
|
|
#T=t_dap3b
|
|
T=t_dap3c
|
|
|
|
v::
|
|
cc -g -c ${T}.c ${INCL}
|
|
cc -g -o v ${T}.o ${LIBS} ${RPATH}
|
|
|
|
do::
|
|
pushd ..; make; popd ; $(MAKE) -f Make0 ncd
|
|
##################################################
|
|
FF=cache constraints3 dapattr3 dapdebug daputil ncdap3 ncdap3a
|
|
fix::
|
|
for f in ${FF} ; do \
|
|
rm -f ./$${f}.c ;\
|
|
sed -e 's/oc_log/nclog/g' -e 's/OCLOG/NCLOG/g' <ckp1/$${f}.c >./$${f}.c ; \
|
|
done |