diff --git a/include/exiv2/types.hpp b/include/exiv2/types.hpp index 03419f0f..05268dac 100644 --- a/include/exiv2/types.hpp +++ b/include/exiv2/types.hpp @@ -201,7 +201,7 @@ struct EXIV2API DataBuf { int cmpBytes(size_t offset, const void* buf, size_t bufsize) const; //! Returns a data pointer. - byte* data(size_t offset = 0); + [[nodiscard]] byte* data(size_t offset = 0); //! Returns a (read-only) data pointer. [[nodiscard]] const byte* c_data(size_t offset = 0) const; diff --git a/src/types.cpp b/src/types.cpp index 1d03c8b4..a3f691e9 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -172,21 +172,14 @@ int Exiv2::DataBuf::cmpBytes(size_t offset, const void* buf, size_t bufsize) con } byte* Exiv2::DataBuf::data(size_t offset) { - if (offset >= pData_.size()) { - throw std::out_of_range("Overflow in Exiv2::DataBuf::c_data"); - } - if (pData_.empty() || pData_.size() == offset) { - return nullptr; - } - return &pData_[offset]; + return const_cast(c_data(offset)); } const byte* Exiv2::DataBuf::c_data(size_t offset) const { - if (offset >= pData_.size()) { - throw std::out_of_range("Overflow in Exiv2::DataBuf::c_data"); - } - if (pData_.empty() || pData_.size() == offset) { + if (pData_.empty()) { return nullptr; + } else if (offset >= pData_.size()) { + throw std::out_of_range("Overflow in Exiv2::DataBuf::c_data"); } return &pData_[offset]; } diff --git a/unitTests/test_types.cpp b/unitTests/test_types.cpp index 227a345e..ba77a11c 100644 --- a/unitTests/test_types.cpp +++ b/unitTests/test_types.cpp @@ -48,7 +48,8 @@ TEST(DataBuf, canBeConstructedFromExistingData) { TEST(DataBuf, tryingToAccessTooFarElementThrows) { const std::array data {'h', 'o', 'l', 'a'}; DataBuf instance(data.data(), data.size()); - ASSERT_THROW(instance.data(4), std::out_of_range); + ASSERT_THROW([[maybe_unused]] auto d = instance.data(4), std::out_of_range); + ASSERT_THROW([[maybe_unused]] auto d = instance.c_data(4), std::out_of_range); } // Test methods like DataBuf::read_uint32 and DataBuf::write_uint32.