rem: assert (entry);
add: if (! entry) abort ();
context: hash_insert (Hash_table *table, const void *entry){  void *data;  struct hash_entry *bucket;  assert (entry);		/* cannot insert a NULL entry */  /* If there's a matching entry already in the table, return that.  */  if ((data = hash_find_entry (table, entry, &bucket, false)) != NULL)    return data;  /* ENTRY is not matched, it should be inserted.  */  if (bucket->data)    {      struct hash_entry *new_entry = allocate_entry (table);      if (new_entry == NULL)	return NULL;      /* Add ENTRY in the overflow of the bucket.  */      new_entry->data = (void *) entry;      new_entry->next = bucket->next;      bucket->next = new_entry;      table->n_entries++;      return (void *) entry;    }  /* Add ENTRY right in the bucket head.  */  bucket->data = (void *) entry;  table->n_entries++;  table->n_buckets_used++;  /* If the growth threshold of the buckets in use has been reached, increase     the table size and rehash.  There's no point in checking the number of     entries:  if the hashing function is ill-conditioned, rehashing is not     likely to improve it.  */  if (table->n_buckets_used      > table->tuning->growth_threshold * table->n_buckets)    {      /* Check more fully, before starting real work.  If tuning arguments	 became invalid, the second check will rely on proper defaults.  */      check_tuning (table);      if (table->n_buckets_used	  > table->tuning->growth_threshold * table->n_buckets)	{	  const Hash_tuning *tuning = table->tuning;	  unsigned candidate	    = (unsigned) (tuning->is_n_buckets			  ? (table->n_buckets * tuning->growth_factor)			  : (table->n_buckets * tuning->growth_factor			     * tuning->growth_threshold));	  /* If the rehash fails, arrange to return NULL.  */	  if (!hash_rehash (table, candidate))	    entry = NULL;	}    }  return (void *) entry;}