From 6964f5f9f2f83db92d94287c0f0d380db7006585 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20D=C3=ADaz=20M=C3=A1s?= Date: Wed, 13 Apr 2022 13:25:50 +0200 Subject: [PATCH] DataBuf::c_data() returns nullptr when empty + avoid duplication After the previous commit, I realized that std::vector::data() also returns nullptr when the vector is empty. So I decided to emulate this behavior in DataBuf::c_data(). Anyways, the changes done in the previous commit are valid and allow us to avoid some processing when the DataBuf is empty. --- include/exiv2/types.hpp | 2 +- src/types.cpp | 15 ++++----------- unitTests/test_types.cpp | 3 ++- 3 files changed, 7 insertions(+), 13 deletions(-) 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.