From 29ce4807fbbc0a2ce224afe6d862491440bd1333 Mon Sep 17 00:00:00 2001 From: "Markus F.X.J. Oberhumer" Date: Sun, 4 Feb 2024 13:37:00 +0100 Subject: [PATCH] all: minor updates --- src/check/dt_cxxlib.cpp | 2 ++ src/check/dt_impl.cpp | 2 ++ src/check/dt_xspan.cpp | 7 ++++++- src/util/membuffer.cpp | 4 ++++ src/util/membuffer.h | 3 +-- src/util/xspan_impl_common.h | 21 ++++++++++++--------- 6 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/check/dt_cxxlib.cpp b/src/check/dt_cxxlib.cpp index 463c1788..3657401f 100644 --- a/src/check/dt_cxxlib.cpp +++ b/src/check/dt_cxxlib.cpp @@ -27,6 +27,7 @@ // lots of tests (and probably quite a number of redundant tests) // modern compilers will optimize away much of this code +#if 0 // TODO later // libc++ hardenining #if defined(__clang__) && defined(__clang_major__) && (__clang_major__ + 0 >= 18) #if DEBUG @@ -40,6 +41,7 @@ #define _LIBCPP_ENABLE_ASSERTIONS 1 #endif #endif +#endif // TODO later #include "../headers.h" #include diff --git a/src/check/dt_impl.cpp b/src/check/dt_impl.cpp index f16b45c8..15b9e55d 100644 --- a/src/check/dt_impl.cpp +++ b/src/check/dt_impl.cpp @@ -28,6 +28,7 @@ // doctest support code implementation **************************************************************************/ +#if 0 // TODO later // libc++ hardenining #if defined(__clang__) && defined(__clang_major__) && (__clang_major__ + 0 >= 18) #if DEBUG @@ -41,6 +42,7 @@ #define _LIBCPP_ENABLE_ASSERTIONS 1 #endif #endif +#endif // TODO later #if defined(__has_include) #if __has_include() diff --git a/src/check/dt_xspan.cpp b/src/check/dt_xspan.cpp index 998ff0cb..cc6f7fde 100644 --- a/src/check/dt_xspan.cpp +++ b/src/check/dt_xspan.cpp @@ -242,7 +242,7 @@ TEST_CASE("basic xspan usage") { } TEST_CASE("xspan array access") { - constexpr size_t N = 16; + const size_t N = 16; char buf[N]; memset(buf, 0, sizeof(buf)); XSPAN_0_VAR(char, c0, buf, sizeof(buf)); @@ -254,6 +254,7 @@ TEST_CASE("xspan array access") { cp[i] += 1; for (size_t i = 0; i != N; ++i) cs[i] += 1; +#if __cplusplus >= 201103L for (auto ptr = c0; ptr != c0 + N; ++ptr) *ptr += 1; for (auto ptr = c0 + 0; ptr < c0 + N; ++ptr) @@ -266,6 +267,7 @@ TEST_CASE("xspan array access") { *ptr += 1; for (auto ptr = cs + 0; ptr < cs + N; ++ptr) *ptr += 1; +#endif } /************************************************************************* @@ -685,6 +687,9 @@ TEST_CASE("Span subspan") { CHECK((as + 2).subspan(0, -2)[0] == 0); CHECK_THROWS(as.subspan(1, 0)[0]); CHECK_THROWS(as.subspan(1, 1)[-1]); + CHECK(as.subspan(1)[0] == 1); + CHECK(as.subspan(2)[0] == 2); + CHECK(as.subspan(3)[0] == 3); } TEST_CASE("Span constness") { diff --git a/src/util/membuffer.cpp b/src/util/membuffer.cpp index b712abd6..cdc0364d 100644 --- a/src/util/membuffer.cpp +++ b/src/util/membuffer.cpp @@ -253,6 +253,10 @@ TEST_CASE("MemBuffer core") { CHECK_THROWS(mb.alloc(0x30000000 + 1)); CHECK(raw_bytes(mb, 0) == nullptr); CHECK_THROWS(raw_bytes(mb, 1)); + CHECK_THROWS(mb.begin()); + CHECK_THROWS(mb.end()); + CHECK_THROWS(mb.cbegin()); + CHECK_THROWS(mb.cend()); mb.alloc(N); mb.checkState(); CHECK(mb.begin() == mb.cbegin()); diff --git a/src/util/membuffer.h b/src/util/membuffer.h index ef0074ff..3f76e61d 100644 --- a/src/util/membuffer.h +++ b/src/util/membuffer.h @@ -45,8 +45,7 @@ public: typedef pointer iterator; typedef typename std::add_pointer::type const_iterator; protected: - static constexpr size_t element_size = sizeof(element_type); - static_assert(element_size >= 1 && element_size <= UPX_RSIZE_MAX_MEM); + static const size_t element_size = sizeof(element_type); protected: pointer ptr; diff --git a/src/util/xspan_impl_common.h b/src/util/xspan_impl_common.h index 66d6063a..9ca2aa7a 100644 --- a/src/util/xspan_impl_common.h +++ b/src/util/xspan_impl_common.h @@ -271,14 +271,17 @@ public: Self &operator=(MemBuffer &mb) { return assign(Self(mb)); } #endif + // subspan (creates a new value) Self subspan(ptrdiff_t offset, ptrdiff_t count) const { - pointer begin = check_add(ptr, offset); - pointer end = check_add(begin, count); - if (begin <= end) - return Self(Unchecked, begin, (end - begin) * sizeof(T), begin); + pointer p_begin = check_add(ptr, offset); + pointer p_end = check_add(p_begin, count); + if (p_begin <= p_end) + return Self(Unchecked, p_begin, (p_end - p_begin) * sizeof(T), p_begin); else - return Self(Unchecked, end, (begin - end) * sizeof(T), end); + return Self(Unchecked, p_end, (p_begin - p_end) * sizeof(T), p_end); } + // subspan (creates a new value) + Self subspan(ptrdiff_t offset) const { return subspan(offset, size() - offset); } // cast to a different type (creates a new value) template @@ -454,16 +457,16 @@ public: // raw access // like C++20 std::span pointer data() const noexcept { return ptr; } pointer data(size_t bytes) const { return raw_bytes(bytes); } // UPX extra - // size_type size() const { return size_bytes() / sizeof(element_type); } // NOT USED + size_type size() const noexcept { return size_bytes() / sizeof(element_type); } size_type size_bytes() const { assertInvariants(); if __acc_cte (!configRequirePtr && ptr == nullptr) return 0; if __acc_cte (!configRequireBase && base == nullptr) return 0; - const charptr begin = (const charptr) ptr; - const charptr end = (const charptr) base + size_in_bytes; - return end - begin; + const charptr p_begin = (const charptr) ptr; + const charptr p_end = (const charptr) base + size_in_bytes; + return p_end - p_begin; } #if CLANG_FORMAT_DUMMY_CLASS