From dc7748afb99372d4f3c4ce8e6612bd3d5e6ff481 Mon Sep 17 00:00:00 2001 From: Jonathan Kim Date: Mon, 20 Aug 2012 15:11:58 -0500 Subject: [svn-r22701] Purpose: Address HDFFV-7942 - h5diff: incorrect result for comparing attribute data with different type size in same class Description: When comparing attribute data values with same type class but different size, the result was incorrect. It was due to the size difference and got truncated. Fixed to match up the smaller type size to big type size like what dataset does. Merged from HDF5 trunk r22684 and r22691. Tested: jam (linux32-LE), koala (linux64-LE), ostrich (linuxppc64-BE), tejeda (mac32-LE), Windows (32-LE cmake), cmake (jam) --- MANIFEST | 1 + release_docs/RELEASE.txt | 3 +++ tools/h5diff/CMakeLists.txt | 7 ++++++ tools/h5diff/h5diffgentest.c | 17 +++++++++++++ tools/h5diff/testfiles/h5diff_59.txt | 11 +++++++++ tools/h5diff/testfiles/h5diff_dtypes.h5 | Bin 10776 -> 11416 bytes tools/h5diff/testh5diff.sh | 5 ++++ tools/lib/h5diff.h | 5 ++++ tools/lib/h5diff_attr.c | 8 ++++++ tools/lib/h5diff_dset.c | 23 +++-------------- tools/lib/h5diff_util.c | 42 ++++++++++++++++++++++++++++++++ 11 files changed, 103 insertions(+), 19 deletions(-) create mode 100644 tools/h5diff/testfiles/h5diff_59.txt diff --git a/MANIFEST b/MANIFEST index 5fa753e..81f6e5e 100644 --- a/MANIFEST +++ b/MANIFEST @@ -1697,6 +1697,7 @@ ./tools/h5diff/testfiles/h5diff_56.txt ./tools/h5diff/testfiles/h5diff_57.txt ./tools/h5diff/testfiles/h5diff_58.txt +./tools/h5diff/testfiles/h5diff_59.txt ./tools/h5diff/testfiles/h5diff_600.txt ./tools/h5diff/testfiles/h5diff_601.txt ./tools/h5diff/testfiles/h5diff_603.txt diff --git a/release_docs/RELEASE.txt b/release_docs/RELEASE.txt index 2c39d04..06ab9a7 100644 --- a/release_docs/RELEASE.txt +++ b/release_docs/RELEASE.txt @@ -112,6 +112,9 @@ Bug Fixes since HDF5-1.8.9 Tools ----- + - h5diff: Fixed the incorrect result when comparing attribute data + values and the data type has same class but different size. + HDFFV-7942 (JKM 08/15/2012) - h5diff: Fixed test failure for "make check" due to failure of copying test files when performed in HDF5 source tree. Also applied to other tools. HDFFV-8107 (JKM 2012/08/01) diff --git a/tools/h5diff/CMakeLists.txt b/tools/h5diff/CMakeLists.txt index 3357b97..903564f 100644 --- a/tools/h5diff/CMakeLists.txt +++ b/tools/h5diff/CMakeLists.txt @@ -202,6 +202,7 @@ IF (BUILD_TESTING) ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_56.txt ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_57.txt ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_58.txt + ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_59.txt ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_500.txt ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_501.txt ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_502.txt @@ -702,6 +703,8 @@ IF (BUILD_TESTING) h5diff_57.out.err h5diff_58.out h5diff_58.out.err + h5diff_59.out + h5diff_59.out.err h5diff_500.out h5diff_500.out.err h5diff_501.out @@ -960,6 +963,10 @@ ADD_H5_TEST (h5diff_57 0 -v ${FILE4} ${FILE4} dset7a dset7b) # 5.8 (region reference) ADD_H5_TEST (h5diff_58 1 -v ${FILE7} ${FILE8} refreg) +# test for both dset and attr with same type but with different size +# ( HDDFV-7942 ) +ADD_H5_TEST (h5diff_59 0 -v ${FILE4} ${FILE4} dset11a dset11b) + # ############################################################################## # # Error messages # ############################################################################## diff --git a/tools/h5diff/h5diffgentest.c b/tools/h5diff/h5diffgentest.c index c370f79..7c69154 100644 --- a/tools/h5diff/h5diffgentest.c +++ b/tools/h5diff/h5diffgentest.c @@ -759,6 +759,7 @@ int test_datatypes(const char *fname) { hid_t fid1; + hid_t dset; hsize_t dims[2]={3,2}; herr_t status; char buf1a[3][2] = {{1,1},{1,1},{1,1}}; @@ -790,6 +791,9 @@ int test_datatypes(const char *fname) unsigned int buf10a[3][2] = {{UIMAX,1},{1,1},{1,1}}; unsigned int buf10b[3][2] = {{UIMAX-1,1},{3,4},{5,6}}; + unsigned short buf11a[3][2] = {{204,205},{2,3},{1,1}}; + unsigned int buf11b[3][2] = {{204,205},{2,3},{1,1}}; + /*------------------------------------------------------------------------- * Create a file @@ -880,6 +884,19 @@ int test_datatypes(const char *fname) write_dset(fid1,2,dims,"dset10a",H5T_NATIVE_UINT,buf10a); write_dset(fid1,2,dims,"dset10b",H5T_NATIVE_UINT,buf10b); + /*------------------------------------------------------------------------- + * Same type class, different size + *------------------------------------------------------------------------- + */ + write_dset(fid1,2,dims,"dset11a",H5T_STD_U16LE,buf11a); + dset=H5Dopen2 (fid1, "dset11a", H5P_DEFAULT); + write_attr(dset,2,dims,"attr",H5T_STD_U16LE,buf11a); + H5Dclose (dset); + + write_dset(fid1,2,dims,"dset11b",H5T_STD_U32LE,buf11b); + dset=H5Dopen2 (fid1, "dset11b", H5P_DEFAULT); + write_attr(dset,2,dims,"attr",H5T_STD_U32LE,buf11b); + H5Dclose (dset); /*------------------------------------------------------------------------- * Close diff --git a/tools/h5diff/testfiles/h5diff_59.txt b/tools/h5diff/testfiles/h5diff_59.txt new file mode 100644 index 0000000..aeefa3a --- /dev/null +++ b/tools/h5diff/testfiles/h5diff_59.txt @@ -0,0 +1,11 @@ +dataset: and +Warning: different storage datatype + has file datatype H5T_STD_U16LE + has file datatype H5T_STD_U32LE +Warning: different storage datatype + has file datatype H5T_STD_U16LE + has file datatype H5T_STD_U32LE +attribute: > and > +0 differences found +0 differences found +EXIT CODE: 0 diff --git a/tools/h5diff/testfiles/h5diff_dtypes.h5 b/tools/h5diff/testfiles/h5diff_dtypes.h5 index 1629664..ffa5264 100644 Binary files a/tools/h5diff/testfiles/h5diff_dtypes.h5 and b/tools/h5diff/testfiles/h5diff_dtypes.h5 differ diff --git a/tools/h5diff/testh5diff.sh b/tools/h5diff/testh5diff.sh index 7e95e80..db37f24 100755 --- a/tools/h5diff/testh5diff.sh +++ b/tools/h5diff/testh5diff.sh @@ -234,6 +234,7 @@ $SRC_H5DIFF_TESTFILES/h5diff_55.txt $SRC_H5DIFF_TESTFILES/h5diff_56.txt $SRC_H5DIFF_TESTFILES/h5diff_57.txt $SRC_H5DIFF_TESTFILES/h5diff_58.txt +$SRC_H5DIFF_TESTFILES/h5diff_59.txt $SRC_H5DIFF_TESTFILES/h5diff_500.txt $SRC_H5DIFF_TESTFILES/h5diff_501.txt $SRC_H5DIFF_TESTFILES/h5diff_502.txt @@ -626,6 +627,10 @@ TOOLTEST h5diff_57.txt -v h5diff_dtypes.h5 h5diff_dtypes.h5 dset7a dset7b # 5.8 (region reference) TOOLTEST h5diff_58.txt -v h5diff_dset1.h5 h5diff_dset2.h5 refreg +# test for both dset and attr with same type but with different size +# ( HDDFV-7942 ) +TOOLTEST h5diff_59.txt -v h5diff_dtypes.h5 h5diff_dtypes.h5 dset11a dset11b + # ############################################################################## # # Error messages # ############################################################################## diff --git a/tools/lib/h5diff.h b/tools/lib/h5diff.h index f05d0de..2530805 100644 --- a/tools/lib/h5diff.h +++ b/tools/lib/h5diff.h @@ -180,6 +180,7 @@ hsize_t diff_attr(hid_t loc1_id, *------------------------------------------------------------------------- */ +/* in h5diff_util.c */ void print_found(hsize_t nfound); void print_type(hid_t type); const char* diff_basename(const char *name); @@ -187,6 +188,10 @@ const char* get_type(h5trav_type_t type); const char* get_class(H5T_class_t tclass); const char* get_sign(H5T_sign_t sign); void print_dimensions (int rank, hsize_t *dims); +herr_t match_up_memsize (hid_t f_tid1_id, hid_t f_tid2_id, + hid_t *m_tid1, hid_t *m_tid2, + size_t *m_size1, size_t *m_size2); +/* in h5diff.c */ int print_objname(diff_opt_t *options, hsize_t nfound); void do_print_objname (const char *OBJ, const char *path1, const char *path2, diff_opt_t * opts); void do_print_attrname (const char *attr, const char *path1, const char *path2); diff --git a/tools/lib/h5diff_attr.c b/tools/lib/h5diff_attr.c index 85cd01f..144159a 100644 --- a/tools/lib/h5diff_attr.c +++ b/tools/lib/h5diff_attr.c @@ -405,6 +405,14 @@ hsize_t diff_attr(hid_t loc1_id, continue; } + /*----------------------------------------------------------------- + * "upgrade" the smaller memory size + *------------------------------------------------------------------ + */ + if (FAIL == match_up_memsize (ftype1_id, ftype2_id, + &mtype1_id, &mtype2_id, + &msize1, &msize2)) + goto error; /*--------------------------------------------------------------------- * read diff --git a/tools/lib/h5diff_dset.c b/tools/lib/h5diff_dset.c index c1ed429..a08f0be 100644 --- a/tools/lib/h5diff_dset.c +++ b/tools/lib/h5diff_dset.c @@ -361,25 +361,10 @@ hsize_t diff_datasetid( hid_t did1, *------------------------------------------------------------------ */ - if(m_size1 != m_size2) { - if(m_size1 < m_size2) { - H5Tclose(m_tid1); - - if((m_tid1 = h5tools_get_native_type(f_tid2)) < 0) - goto error; - - m_size1 = H5Tget_size(m_tid1); - } /* end if */ - else { - H5Tclose(m_tid2); - - if((m_tid2 = h5tools_get_native_type(f_tid1)) < 0) - goto error; - - m_size2 = H5Tget_size(m_tid2); - } /* end else */ - } /* end if */ - HDassert(m_size1 == m_size2); + if (FAIL == match_up_memsize (f_tid1, f_tid2, + &m_tid1, &m_tid2, + &m_size1, &m_size2)) + goto error; /* print names */ if(obj1_name) diff --git a/tools/lib/h5diff_util.c b/tools/lib/h5diff_util.c index 0d476b6..aefd641 100644 --- a/tools/lib/h5diff_util.c +++ b/tools/lib/h5diff_util.c @@ -311,4 +311,46 @@ void print_found(hsize_t nfound) } +/*----------------------------------------------------------------- + * Function: match_up_memsize + * + * Purpose: match smaller memory size up to bigger memory size + *------------------------------------------------------------------ + */ +herr_t match_up_memsize (hid_t f_tid1_id, hid_t f_tid2_id, + hid_t *m_tid1, hid_t *m_tid2, + size_t *m_size1, size_t *m_size2) +{ + herr_t ret = SUCCEED; + + if( (*m_size1) != (*m_size2) ) + { + if( (*m_size1) < (*m_size2) ) + { + H5Tclose( *m_tid1 ); + + if(( (*m_tid1) = h5tools_get_native_type(f_tid2_id)) < 0) + { + ret = FAIL; + goto out; + } + + *m_size1 = H5Tget_size( *m_tid1 ); + } /* end if */ + else { + H5Tclose(*m_tid2); + if(( (*m_tid2) = h5tools_get_native_type(f_tid1_id)) < 0) + { + ret = FAIL; + goto out; + } + + *m_size2 = H5Tget_size(*m_tid2); + } /* end else */ + } /* end if */ + HDassert( (*m_size1) == (*m_size2) ); + +out: + return ret; +} -- cgit v0.12