From 9ce370249bbdebfe246b04f9318b58852cfe0809 Mon Sep 17 00:00:00 2001 From: Paul Smith Date: Mon, 13 May 2019 18:45:18 -0400 Subject: [PATCH] * src/hash.c (jash_string): [SV 54980] Avoid ASAN error --- src/hash.c | 57 +++++++++++++++++++++++--------------------- tests/test_driver.pl | 2 ++ 2 files changed, 32 insertions(+), 27 deletions(-) diff --git a/src/hash.c b/src/hash.c index d04f2bc0..bd3892e3 100644 --- a/src/hash.c +++ b/src/hash.c @@ -47,7 +47,7 @@ hash_init (struct hash_table *ht, unsigned long size, if (ht->ht_vec == 0) { fprintf (stderr, _("can't allocate %lu bytes for hash table: memory exhausted"), - ht->ht_size * (unsigned long) sizeof (struct token *)); + ht->ht_size * (unsigned long) sizeof (struct token *)); exit (MAKE_TROUBLE); } @@ -95,22 +95,22 @@ hash_find_slot (struct hash_table *ht, const void *key) slot = &ht->ht_vec[hash_1]; if (*slot == 0) - return (deleted_slot ? deleted_slot : slot); + return (deleted_slot ? deleted_slot : slot); if (*slot == hash_deleted_item) - { - if (deleted_slot == 0) - deleted_slot = slot; - } + { + if (deleted_slot == 0) + deleted_slot = slot; + } else - { - if (key == *slot) - return slot; - if ((*ht->ht_compare) (key, *slot) == 0) - return slot; - ht->ht_collisions++; - } + { + if (key == *slot) + return slot; + if ((*ht->ht_compare) (key, *slot) == 0) + return slot; + ht->ht_collisions++; + } if (!hash_2) - hash_2 = (*ht->ht_hash_2) (key) | 1; + hash_2 = (*ht->ht_hash_2) (key) | 1; hash_1 += hash_2; } } @@ -139,7 +139,7 @@ hash_insert_at (struct hash_table *ht, const void *item, const void *slot) { ht->ht_fill++; if (old_item == 0) - ht->ht_empty_slots--; + ht->ht_empty_slots--; old_item = item; } *(void const **) slot = item; @@ -182,7 +182,7 @@ hash_free_items (struct hash_table *ht) { void *item = *vec; if (!HASH_VACANT (item)) - free (item); + free (item); *vec = 0; } ht->ht_fill = 0; @@ -227,7 +227,7 @@ hash_map (struct hash_table *ht, hash_map_func_t map) for (slot = ht->ht_vec; slot < end; slot++) { if (!HASH_VACANT (*slot)) - (*map) (*slot); + (*map) (*slot); } } @@ -240,7 +240,7 @@ hash_map_arg (struct hash_table *ht, hash_map_arg_func_t map, void *arg) for (slot = ht->ht_vec; slot < end; slot++) { if (!HASH_VACANT (*slot)) - (*map) (*slot, arg); + (*map) (*slot, arg); } } @@ -264,10 +264,10 @@ hash_rehash (struct hash_table *ht) for (ovp = old_vec; ovp < &old_vec[old_ht_size]; ovp++) { if (! HASH_VACANT (*ovp)) - { - void **slot = hash_find_slot (ht, *ovp); - *slot = *ovp; - } + { + void **slot = hash_find_slot (ht, *ovp); + *slot = *ovp; + } } ht->ht_empty_slots = ht->ht_size - ht->ht_fill; free (old_vec); @@ -277,12 +277,12 @@ void hash_print_stats (struct hash_table *ht, FILE *out_FILE) { fprintf (out_FILE, _("Load=%lu/%lu=%.0f%%, "), ht->ht_fill, ht->ht_size, - 100.0 * (double) ht->ht_fill / (double) ht->ht_size); + 100.0 * (double) ht->ht_fill / (double) ht->ht_size); fprintf (out_FILE, _("Rehash=%u, "), ht->ht_rehashes); fprintf (out_FILE, _("Collisions=%lu/%lu=%.0f%%"), ht->ht_collisions, ht->ht_lookups, - (ht->ht_lookups - ? (100.0 * (double) ht->ht_collisions / (double) ht->ht_lookups) - : 0)); + (ht->ht_lookups + ? (100.0 * (double) ht->ht_collisions / (double) ht->ht_lookups) + : 0)); } /* Dump all items into a NULL-terminated vector. Use the @@ -329,7 +329,7 @@ round_up_2 (unsigned long n) } #define rol32(v, n) \ - ((v) << (n) | ((v) >> (32 - (n)))) + ((v) << (n) | ((v) >> (32 - (n)))) /* jhash_mix -- mix 3 32-bit values reversibly. */ #define jhash_mix(a, b, c) \ @@ -446,6 +446,9 @@ unsigned jhash(unsigned const char *k, int length) } while (0) #endif +/* This function performs magic which is correct but causes ASAN heartburn + when we pass in a global constant string (at least). */ +__attribute__((no_sanitize_address)) unsigned jhash_string(unsigned const char *k) { unsigned int a, b, c; diff --git a/tests/test_driver.pl b/tests/test_driver.pl index 969b3784..4af84daf 100644 --- a/tests/test_driver.pl +++ b/tests/test_driver.pl @@ -179,6 +179,8 @@ sub toplevel foreach (# UNIX-specific things 'TZ', 'TMPDIR', 'HOME', 'USER', 'LOGNAME', 'PATH', 'LD_LIBRARY_PATH', + # SAN things + 'ASAN_OPTIONS', 'UBSAN_OPTIONS', # Purify things 'PURIFYOPTIONS', # Windows NT-specific stuff