bison-patches
[Top][All Lists]
Advanced

[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;





reply via email to

[Prev in Thread] Current Thread [Next in Thread]