mirror of
https://github.com/Z3Prover/z3
synced 2026-08-08 15:02:09 +00:00
Fix vector byte-size overflow during expansion
Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com>
This commit is contained in:
parent
c4fbb948ff
commit
a37f306cb4
2 changed files with 11 additions and 2 deletions
|
|
@ -19,6 +19,7 @@ Revision History:
|
|||
#include "util/vector.h"
|
||||
#include "util/rational.h"
|
||||
#include <iostream>
|
||||
#include <cstdint>
|
||||
|
||||
static void tst_resize_rational() {
|
||||
// grow from empty using default initialization (zero)
|
||||
|
|
@ -141,8 +142,16 @@ static void tst1() {
|
|||
}
|
||||
}
|
||||
|
||||
static void tst_expand_vector_byte_count() {
|
||||
vector<uint16_t, true, uint8_t> v;
|
||||
for (unsigned i = 0; i < 192; ++i)
|
||||
v.push_back(i);
|
||||
ENSURE(v.size() == 192);
|
||||
}
|
||||
|
||||
void tst_vector() {
|
||||
tst_resize_rational();
|
||||
tst_resize();
|
||||
tst1();
|
||||
tst_expand_vector_byte_count();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -80,9 +80,9 @@ class vector {
|
|||
static_assert(std::is_nothrow_move_constructible<T>::value);
|
||||
SASSERT(capacity() > 0);
|
||||
SZ old_capacity = reinterpret_cast<SZ *>(m_data)[CAPACITY_IDX];
|
||||
SZ old_capacity_T = sizeof(T) * old_capacity + sizeof(SZ) * 2;
|
||||
size_t old_capacity_T = sizeof(T) * static_cast<size_t>(old_capacity) + sizeof(SZ) * 2;
|
||||
SZ new_capacity = (3 * old_capacity + 1) >> 1;
|
||||
SZ new_capacity_T = sizeof(T) * new_capacity + sizeof(SZ) * 2;
|
||||
size_t new_capacity_T = sizeof(T) * static_cast<size_t>(new_capacity) + sizeof(SZ) * 2;
|
||||
if (new_capacity <= old_capacity || new_capacity_T <= old_capacity_T) {
|
||||
throw default_exception("Overflow encountered when expanding vector");
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue