Fix bug reported by florommel on dict's reserve

This commit is contained in:
Patrick Pelissier committed 2025-07-18 20:11:13 +02:00
1 parent ad646f5e04
commit 8c8a1e2822
2 files changed
+29

No files matched your search

+6
View File
@@ -325,6 +325,9 @@ M_ARRAY_DEF(m_array_index, m_indexhash_t, M_POD_OPLIST)
{ \ { \
map->upper_limit = (m_index_t) ((double) size * M_D1CT_OA_UPPER_BOUND) - 1; \ map->upper_limit = (m_index_t) ((double) size * M_D1CT_OA_UPPER_BOUND) - 1; \
map->lower_limit = (size <= M_D1CT_INITIAL_SIZE) ? 0 : (m_index_t) ((double) size * M_D1CT_OA_LOWER_BOUND) ; \ map->lower_limit = (size <= M_D1CT_INITIAL_SIZE) ? 0 : (m_index_t) ((double) size * M_D1CT_OA_LOWER_BOUND) ; \
if (M_UNLIKELY(map->count <= map->lower_limit)) { \
map->lower_limit = 0; \
} \
} \ } \
\ \
M_P(void, name, _init, dict_t map) \ M_P(void, name, _init, dict_t map) \
@@ -1534,6 +1537,9 @@ enum m_d1ct_oa_element_e {
/* FIXME: Overflow not handled. What to do in case of it? */ \ /* FIXME: Overflow not handled. What to do in case of it? */ \
dict->upper_limit = (size_t) ((double) size * coeff_up) - 1; \ dict->upper_limit = (size_t) ((double) size * coeff_up) - 1; \
dict->lower_limit = (size <= M_D1CT_INITIAL_SIZE) ? 0 : (size_t) ((double) size * coeff_down) ; \ dict->lower_limit = (size <= M_D1CT_INITIAL_SIZE) ? 0 : (size_t) ((double) size * coeff_down) ; \
if (M_UNLIKELY(dict->count <= dict->lower_limit)) { \
dict->lower_limit = 0; \
} \
} \ } \
\ \
M_P(void, name, _init, dict_t dict) \ M_P(void, name, _init, dict_t dict) \
+23
View File
@@ -893,6 +893,28 @@ static void test_coverage(void)
} }
/* Reported by florommel */
static void test_reserve_bug(void)
{
dict_int_t dict;
dict_int_init(dict);
/* NOTE: Remove the following line to make it not fail: */
dict_int_reserve(dict, 32);
int k = 0;
for (int n = 0; n < 100; n++) {
for (int i = 0; i < 3; i++) {
dict_int_set_at(dict, ++k, 42);
}
for (int i = 0; i < 3; i++) {
dict_int_erase(dict, k--);
}
k += 100; /* ensure fresh keys in the next iteration */
}
dict_int_clear(dict);
}
int main(void) int main(void)
{ {
test1(); test1();
@@ -905,6 +927,7 @@ int main(void)
test_it_oa(); test_it_oa();
test_oa_str1(); test_oa_str1();
test_oa_str2(); test_oa_str2();
test_reserve_bug();
testobj_final_check(); testobj_final_check();
test_coverage(); test_coverage();
exit(0); exit(0);