static void test_size_mul(void) { const size_t half_size = SIZE_MAX / 2; const size_t half_double_size = (SIZE_MAX % 2) ? (SIZE_MAX - 1) : SIZE_MAX; size_t out; ASSERT(sol_util_size_mul(half_size, 2, &out) == 0); ASSERT_INT_EQ(out, half_double_size); ASSERT_INT_EQ(sol_util_size_mul(half_size, 4, &out), -EOVERFLOW); }
static int sol_vector_grow(struct sol_vector *v, uint16_t amount) { size_t new_cap, old_cap; uint16_t new_len; if (v->len > UINT16_MAX - amount) return -EOVERFLOW; new_len = v->len + amount; old_cap = align_power2(v->len); new_cap = align_power2(new_len); if (new_cap != old_cap) { void *data; int r; size_t data_size; r = sol_util_size_mul(v->elem_size, new_cap, &data_size); SOL_INT_CHECK(r, < 0, r); data = realloc(v->data, data_size); if (!data) return -ENOMEM; v->data = data; }