From e2ed9c7553d6dcc1daafa1ec603c5956a566917f Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 24 Sep 2018 13:29:11 -0500 Subject: [PATCH] Fix various bugs in HDF5 interface / MGXS code (found by valgrind) --- include/openmc/hdf5_interface.h | 4 ++-- src/hdf5_interface.cpp | 10 +++++++--- src/mgxs_interface.cpp | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/include/openmc/hdf5_interface.h b/include/openmc/hdf5_interface.h index f0b3a245c..a39561d23 100644 --- a/include/openmc/hdf5_interface.h +++ b/include/openmc/hdf5_interface.h @@ -193,13 +193,13 @@ read_attribute(hid_t obj_id, const char* name, std::vector& vec) // Allocate a C char array to get strings auto n = attribute_typesize(obj_id, name); - char buffer[m][n+1]; + char buffer[m][n]; // Read char data in attribute read_attr_string(obj_id, name, n, buffer[0]); for (int i = 0; i < m; ++i) { - vec.emplace_back(&buffer[i][0]); + vec.emplace_back(&buffer[i][0], n); } } diff --git a/src/hdf5_interface.cpp b/src/hdf5_interface.cpp index cecf283ac..d72f7d424 100644 --- a/src/hdf5_interface.cpp +++ b/src/hdf5_interface.cpp @@ -392,7 +392,7 @@ object_name(hid_t obj_id) // Read and return name H5Iget_name(obj_id, buffer, size); - return {buffer, size}; + return buffer; } @@ -439,7 +439,9 @@ read_attr_string(hid_t obj_id, const char* name, size_t slen, char* buffer) { // Create datatype for a string hid_t datatype = H5Tcopy(H5T_C_S1); - H5Tset_size(datatype, slen + 1); + H5Tset_size(datatype, slen); + // numpy uses null-padding when writing fixed-length strings + H5Tset_strpad(datatype, H5T_STR_NULLPAD); // Read data into buffer read_attr(obj_id, name, datatype, buffer); @@ -503,7 +505,9 @@ read_string(hid_t obj_id, const char* name, size_t slen, char* buffer, bool inde { // Create datatype for a string hid_t datatype = H5Tcopy(H5T_C_S1); - H5Tset_size(datatype, slen + 1); + H5Tset_size(datatype, slen); + // numpy uses null-padding when writing fixed-length strings + H5Tset_strpad(datatype, H5T_STR_NULLPAD); // Read data into buffer read_dataset(obj_id, name, datatype, buffer, indep); diff --git a/src/mgxs_interface.cpp b/src/mgxs_interface.cpp index 56f3392ff..0bb464da0 100644 --- a/src/mgxs_interface.cpp +++ b/src/mgxs_interface.cpp @@ -208,7 +208,7 @@ void get_name_c(int index, int name_len, char* name) { // First blank out our input string - std::string str(name_len, ' '); + std::string str(name_len - 1, ' '); std::strcpy(name, str.c_str()); // Now get the data and copy to the C-string