X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Fhtable%2Ftest%2Frun.c;h=ece46a0fd7cf4025ae2249785a2fd9d4694a5ee8;hp=27f744c52cbd05c857e9b5298f2df471f6f8d451;hb=8cca0397ef6f6017b13ce9ab4999bf3d92a2dee5;hpb=198d85adf5e8d9a44b7436bdd046dbffce66b23a diff --git a/ccan/htable/test/run.c b/ccan/htable/test/run.c index 27f744c5..ece46a0f 100644 --- a/ccan/htable/test/run.c +++ b/ccan/htable/test/run.c @@ -96,13 +96,14 @@ static bool check_mask(struct htable *ht, uint64_t val[], unsigned num) int main(int argc, char *argv[]) { unsigned int i; + uintptr_t perfect_bit; struct htable *ht; uint64_t val[NUM_VALS]; uint64_t dne; void *p; struct htable_iter iter; - plan_tests(19); + plan_tests(23); for (i = 0; i < NUM_VALS; i++) val[i] = i; dne = i; @@ -143,6 +144,8 @@ int main(int argc, char *argv[]) htable_add(ht, hash(&val[NUM_VALS-1], NULL), &val[NUM_VALS-1]); ok1(ht->common_mask == 0); ok1(ht->common_bits == 0); + /* Get rid of bogus pointer before we trip over it! */ + htable_del(ht, 0, (void *)~(uintptr_t)&val[NUM_VALS-1]); /* Add the rest. */ add_vals(ht, val, NUM_VALS-1); @@ -151,5 +154,23 @@ int main(int argc, char *argv[]) find_vals(ht, val, NUM_VALS); ok1(!htable_get(ht, hash(&dne, NULL), objcmp, &dne)); + htable_free(ht); + + /* Corner cases: wipe out the perfect bit using bogus pointer. */ + ht = htable_new(hash, NULL); + htable_add(ht, 0, (void *)((uintptr_t)&val[NUM_VALS-1])); + ok1(ht->perfect_bit); + perfect_bit = ht->perfect_bit; + htable_add(ht, 0, (void *)((uintptr_t)&val[NUM_VALS-1] + | perfect_bit)); + ok1(ht->perfect_bit == 0); + htable_del(ht, 0, (void *)((uintptr_t)&val[NUM_VALS-1] | perfect_bit)); + + /* Enlarging should restore it... */ + add_vals(ht, val, NUM_VALS-1); + + ok1(ht->perfect_bit != 0); + htable_free(ht); + return exit_status(); }