diff --git a/src/test/vector.cpp b/src/test/vector.cpp index a206b278ef..27400749e1 100644 --- a/src/test/vector.cpp +++ b/src/test/vector.cpp @@ -144,9 +144,10 @@ static void tst1() { static void tst_expand_vector_byte_count() { vector v; - for (unsigned i = 0; i < 192; ++i) + // 191 forces growth from capacity 127 -> 191 where byte-size exceeds uint8_t. + for (unsigned i = 0; i < 191; ++i) v.push_back(i); - ENSURE(v.size() == 192); + ENSURE(v.size() == 191); } void tst_vector() { diff --git a/src/util/vector.h b/src/util/vector.h index 6ccda5adc7..f7f6d6a9d2 100644 --- a/src/util/vector.h +++ b/src/util/vector.h @@ -28,6 +28,7 @@ Revision History: #include "util/debug.h" #include #include +#include #include #include #include @@ -81,7 +82,10 @@ class vector { SASSERT(capacity() > 0); SZ old_capacity = reinterpret_cast(m_data)[CAPACITY_IDX]; size_t old_capacity_T = sizeof(T) * static_cast(old_capacity) + sizeof(SZ) * 2; - SZ new_capacity = (3 * old_capacity + 1) >> 1; + size_t grown_capacity = (3 * static_cast(old_capacity) + 1) >> 1; + if (grown_capacity > std::numeric_limits::max()) + throw default_exception("Overflow encountered when expanding vector"); + SZ new_capacity = static_cast(grown_capacity); size_t new_capacity_T = sizeof(T) * static_cast(new_capacity) + sizeof(SZ) * 2; if (new_capacity <= old_capacity || new_capacity_T <= old_capacity_T) { throw default_exception("Overflow encountered when expanding vector");