changeset 17403:621e5ff3aca8

malloca: port --enable-gcc-warnings to clang * lib/malloca.c (struct header): New member 'magic', to avoid casts. (mmalloca): Avoid casts from looser to stricter-aligned pointers.
author Paul Eggert <eggert@cs.ucla.edu>
date Wed, 15 May 2013 00:15:45 -0700
parents 9a6c1c655351
children 832be175c090
files ChangeLog lib/malloca.c
diffstat 2 files changed, 15 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2013-05-15  Paul Eggert  <eggert@cs.ucla.edu>
 
+	malloca: port --enable-gcc-warnings to clang
+	* lib/malloca.c (struct header): New member 'magic', to avoid casts.
+	(mmalloca): Avoid casts from looser to stricter-aligned pointers.
+
 	inttostr: port --enable-gcc-warnings to clang
 	* lib/anytostr.c [__clang__]: Ignore -Wtautological-compare.
 
--- a/lib/malloca.c
+++ b/lib/malloca.c
@@ -53,7 +53,7 @@
 /* But the header's size must be a multiple of sa_alignment_max.  */
 #define HEADER_SIZE \
   (((sizeof (struct preliminary_header) + sa_alignment_max - 1) / sa_alignment_max) * sa_alignment_max)
-struct header { void *next; char room[HEADER_SIZE - sizeof (struct preliminary_header) + MAGIC_SIZE]; };
+struct header { void *next; char room[HEADER_SIZE - sizeof (struct preliminary_header)]; int magic; };
 verify (HEADER_SIZE == sizeof (struct header));
 /* We make the hash table quite big, so that during lookups the probability
    of empty hash buckets is quite high.  There is no need to make the hash
@@ -74,20 +74,21 @@
 
   if (nplus >= n)
     {
-      char *p = (char *) malloc (nplus);
+      void *p = malloc (nplus);
 
       if (p != NULL)
         {
           size_t slot;
+          struct header *h = p;
 
-          p += HEADER_SIZE;
+          p = h + 1;
 
           /* Put a magic number into the indicator word.  */
-          ((int *) p)[-1] = MAGIC_NUMBER;
+          h->magic = MAGIC_NUMBER;
 
           /* Enter p into the hash table.  */
           slot = (uintptr_t) p % HASH_TABLE_SIZE;
-          ((struct header *) (p - HEADER_SIZE))->next = mmalloca_results[slot];
+          h->next = mmalloca_results[slot];
           mmalloca_results[slot] = p;
 
           return p;
@@ -123,15 +124,17 @@
           void **chain = &mmalloca_results[slot];
           for (; *chain != NULL;)
             {
+              struct header *h = p;
               if (*chain == p)
                 {
                   /* Found it.  Remove it from the hash table and free it.  */
-                  char *p_begin = (char *) p - HEADER_SIZE;
-                  *chain = ((struct header *) p_begin)->next;
+                  struct header *p_begin = h - 1;
+                  *chain = p_begin->next;
                   free (p_begin);
                   return;
                 }
-              chain = &((struct header *) ((char *) *chain - HEADER_SIZE))->next;
+              h = *chain;
+              chain = &h[-1].next;
             }
         }
       /* At this point, we know it was not a mmalloca() result.  */