all: more assorted cleanups; NFCI

This commit is contained in:
Markus F.X.J. Oberhumer
2024-02-02 10:17:16 +01:00
parent d429801498
commit 718ec468ff
26 changed files with 307 additions and 125 deletions
+41 -14
View File
@@ -90,7 +90,7 @@ void *MemBuffer::subref_impl(const char *errfmt, size_t skip, size_t take) {
// printf is using unsigned formatting
if (!errfmt || !errfmt[0])
errfmt = "bad subref %#x %#x";
snprintf(buf, sizeof(buf), errfmt, (unsigned) skip, (unsigned) take);
upx_safe_snprintf(buf, sizeof(buf), errfmt, (unsigned) skip, (unsigned) take);
throwCantPack(buf);
}
return ptr + skip;
@@ -189,7 +189,7 @@ void MemBuffer::alloc(upx_uint64_t bytes) {
set_ne32(p + size_in_bytes + 0, MAGIC2(p));
set_ne32(p + size_in_bytes + 4, stats.global_alloc_counter);
}
ptr = (pointer) (void *) p;
ptr = upx::ptr_static_cast<pointer>(p);
#if !defined(__SANITIZE_MEMORY__) && DEBUG
memset(ptr, 0xfb, size_in_bytes);
(void) VALGRIND_MAKE_MEM_UNDEFINED(ptr, size_in_bytes);
@@ -247,26 +247,33 @@ void MemBuffer::dealloc() noexcept {
**************************************************************************/
TEST_CASE("MemBuffer core") {
constexpr size_t N = 64;
MemBuffer mb;
CHECK_THROWS(mb.checkState());
CHECK_THROWS(mb.alloc(0x30000000 + 1));
CHECK(raw_bytes(mb, 0) == nullptr);
CHECK_THROWS(raw_bytes(mb, 1));
mb.alloc(64);
mb.alloc(N);
mb.checkState();
CHECK(raw_bytes(mb, 64) != nullptr);
CHECK(raw_bytes(mb, 64) == mb.getVoidPtr());
CHECK_THROWS(raw_bytes(mb, 65));
CHECK_NOTHROW(mb + 64);
CHECK_THROWS(mb + 65);
CHECK(mb.begin() == mb.cbegin());
CHECK(mb.end() == mb.cend());
CHECK(mb.begin() == &mb[0]);
CHECK(mb.end() == &mb[0] + N);
CHECK(mb.cbegin() == &mb[0]);
CHECK(mb.cend() == &mb[0] + N);
CHECK(raw_bytes(mb, N) != nullptr);
CHECK(raw_bytes(mb, N) == mb.getVoidPtr());
CHECK_THROWS(raw_bytes(mb, N + 1));
CHECK_NOTHROW(mb + N);
CHECK_THROWS(mb + (N + 1));
#if ALLOW_INT_PLUS_MEMBUFFER
CHECK_NOTHROW(64 + mb);
CHECK_THROWS(65 + mb);
CHECK_NOTHROW(N + mb);
CHECK_THROWS((N + 1) + mb);
#endif
CHECK_NOTHROW(mb.subref("", 0, 64));
CHECK_NOTHROW(mb.subref("", 64, 0));
CHECK_THROWS(mb.subref("", 1, 64));
CHECK_THROWS(mb.subref("", 64, 1));
CHECK_NOTHROW(mb.subref("", 0, N));
CHECK_NOTHROW(mb.subref("", N, 0));
CHECK_THROWS(mb.subref("", 1, N));
CHECK_THROWS(mb.subref("", N, 1));
if (use_simple_mcheck()) {
byte *p = raw_bytes(mb, 0);
unsigned magic1 = get_ne32(p - 4);
@@ -314,6 +321,26 @@ TEST_CASE("MemBuffer unused") {
CHECK(mb.raw_size_in_bytes() == 0);
}
TEST_CASE("MemBuffer array access") {
constexpr size_t N = 16;
MemBuffer mb(N);
mb.clear();
for (size_t i = 0; i != N; ++i)
mb[i] += 1;
for (byte *ptr = mb; ptr != mb + N; ++ptr)
*ptr += 1;
for (byte *ptr = mb + 0; ptr < mb + N; ++ptr)
*ptr += 1;
for (byte *ptr = &mb[0]; ptr != mb.end(); ++ptr)
*ptr += 1;
for (byte *ptr = mb.begin(); ptr < mb.end(); ++ptr)
*ptr += 1;
for (size_t i = 0; i != N; ++i)
assert(mb[i] == 5);
CHECK_NOTHROW((void) &mb[N - 1]);
CHECK_THROWS((void) &mb[N]); // NOT legal for containers like std::vector or MemBuffer
}
TEST_CASE("MemBuffer::getSizeForCompression") {
CHECK_THROWS(MemBuffer::getSizeForCompression(0));
CHECK_THROWS(MemBuffer::getSizeForDecompression(0));