summaryrefslogtreecommitdiff
path: root/src/hash.c
diff options
context:
space:
mode:
authorPaul Smith <psmith@gnu.org>2019-05-13 18:45:18 -0400
committerPaul Smith <psmith@gnu.org>2019-05-19 15:27:26 -0400
commit9ce370249bbdebfe246b04f9318b58852cfe0809 (patch)
tree6a1953745ea1c72197d60458c473d5ea1825fb84 /src/hash.c
parentb5de783f77aa85ae8bd7a8e81d143e09a848fa29 (diff)
downloadmake-git-9ce370249bbdebfe246b04f9318b58852cfe0809.tar.gz
* src/hash.c (jash_string): [SV 54980] Avoid ASAN error
Diffstat (limited to 'src/hash.c')
-rw-r--r--src/hash.c57
1 files changed, 30 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;