[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] cex: fix leaks
From: |
Akim Demaille |
Subject: |
Re: [PATCH] cex: fix leaks |
Date: |
Sun, 17 May 2020 16:31:58 +0200 |
Hi Vincent,
> Le 17 mai 2020 à 15:59, Vincent Imbimbo <address@hidden> a écrit :
>
> * src/state-item.c: Various functions were using heap allocated locals and
> not freeing them
>
> Apple clang doesn't support leak sanitizer, so if this doesn't fix everything
> I'll bite the bullet and install a newer llvm.
You definitely should install brew or MacPort's clang, using tools such as ASAN
is life-changing.
Your patch improves things: we go from
SUMMARY: AddressSanitizer: 262960 byte(s) leaked in 1874 allocation(s).
to
SUMMARY: AddressSanitizer: 187064 byte(s) leaked in 779 allocation(s).
The following commit reduces it further to
SUMMARY: AddressSanitizer: 184968 byte(s) leaked in 648 allocation(s).
I'm looking in what remains.
Cheers!
commit dcde6960d528c88d13bce1bd1de3590231c8b7f4
Author: Akim Demaille <address@hidden>
Date: Sun May 17 16:28:08 2020 +0200
cex: avoid gratuitous heap allocations
There's no need to go for the heap when using gnulib's hash module.
* src/state-item.c (hash_pair_lookup, hash_pair_remove,
state_sym_lookup): Use the heap Luke.
That removes a leak from hash_pair_lookup.
(init_prods): Use hash_pair_insert instead of duplicating it.
diff --git a/src/state-item.c b/src/state-item.c
index 4a09e035..bcb21102 100644
--- a/src/state-item.c
+++ b/src/state-item.c
@@ -68,13 +68,10 @@ hash_pair_free (hash_pair *hp)
static bitset
hash_pair_lookup (Hash_table *tab, int key)
{
- hash_pair *l = xmalloc (sizeof (hash_pair));
- l->key = key;
- hash_pair *hp = (hash_pair *) hash_lookup (tab, l);
- if (!hp)
- return NULL;
- free (l);
- return hp->l;
+ hash_pair probe;
+ probe.key = key;
+ hash_pair *hp = hash_lookup (tab, &probe);
+ return hp ? hp->l : NULL;
}
static void
@@ -83,15 +80,16 @@ hash_pair_insert (Hash_table *tab, int key, bitset val)
hash_pair *hp = xmalloc (sizeof (hash_pair));
hp->key = key;
hp->l = val;
- hash_xinsert (tab, hp);
+ hash_pair *res = hash_xinsert (tab, hp);
+ assert (res == hp);
}
static void
hash_pair_remove (Hash_table *tab, int key)
{
- hash_pair *hp = xmalloc (sizeof (hash_pair));
- hp->key = key;
- hash_delete (tab, hp);
+ hash_pair probe;
+ probe.key = key;
+ hash_delete (tab, &probe);
}
/* A state_item from a state's id and the offset of the item within
@@ -193,11 +191,9 @@ state_sym_comparator (const void *s1, const void *s2)
static state *
state_sym_lookup (symbol_number sym, Hash_table *h)
{
- state *s = xmalloc (sizeof (state));
- s->accessing_symbol = sym;
- state *res = hash_lookup (h, s);
- free (s);
- return res;
+ state probe;
+ probe.accessing_symbol = sym;
+ return hash_lookup (h, &probe);
}
static void
@@ -298,11 +294,8 @@ init_prods (void)
{
bitset copy = bitset_create (nstate_items, BITSET_SPARSE);
bitset_copy (copy, lb);
- hash_pair *prod_hp = xmalloc (sizeof (hash_pair));
- prod_hp->key = j;
- prod_hp->l = copy;
// update prods.
- hash_xinsert (si_prods, prod_hp);
+ hash_pair_insert (si_prods, j, copy);
// update revs.
bitset_iterator biter;
- [PATCH] cex: fix leaks, Vincent Imbimbo, 2020/05/17
- Re: [PATCH] cex: fix leaks,
Akim Demaille <=
- Re: [PATCH] cex: fix leaks, Akim Demaille, 2020/05/17
- Re: [PATCH] cex: fix leaks, Akim Demaille, 2020/05/17
- Re: [PATCH] cex: fix leaks, Akim Demaille, 2020/05/18
- Re: [PATCH] cex: fix leaks, vmi6, 2020/05/18
- Re: [PATCH] cex: fix leaks, Akim Demaille, 2020/05/18
- Re: [PATCH] cex: fix leaks, Vincent Imbimbo, 2020/05/18
- Re: [PATCH] cex: fix leaks, Vincent Imbimbo, 2020/05/18
- Re: [PATCH] cex: fix leaks, Akim Demaille, 2020/05/19