]> git.ozlabs.org Git - ccan/commitdiff
talloc: fix gcc -O3 aliasing warnings
authorRusty Russell <rusty@rustcorp.com.au>
Wed, 3 Nov 2010 00:16:42 +0000 (10:46 +1030)
committerRusty Russell <rusty@rustcorp.com.au>
Wed, 3 Nov 2010 00:16:42 +0000 (10:46 +1030)
A void * could point to anything, but a void ** can't point to any pointer.
So we use a void * and memcpy, which I believe is safe.

ccan/talloc/talloc.c

index ed958a8e5f25fdbeebf83f30b1ea8fef82d018bc..1b96f90fd08baf614dc6da16e3b2fd3e73071327 100644 (file)
@@ -801,21 +801,25 @@ static int talloc_destroy_pointer(void ***pptr)
 void _talloc_set(void *ptr, const void *ctx, size_t size, const char *name)
 {
        void ***child;
 void _talloc_set(void *ptr, const void *ctx, size_t size, const char *name)
 {
        void ***child;
-       void **pptr = ptr;
+       void *p;
 
 
-       *pptr = talloc_named_const(ctx, size, name);
-       if (unlikely(!*pptr))
-               return;
+       p = talloc_named_const(ctx, size, name);
+       if (unlikely(!p))
+               goto set_ptr;
 
 
-       child = talloc(*pptr, void **);
+       child = talloc(p, void **);
        if (unlikely(!child)) {
        if (unlikely(!child)) {
-               talloc_free(*pptr);
-               *pptr = NULL;
-               return;
+               talloc_free(p);
+               p = NULL;
+               goto set_ptr;
        }
        }
-       *child = pptr;
+       *child = ptr;
        talloc_set_name_const(child, "talloc_set destructor");
        talloc_set_destructor(child, talloc_destroy_pointer);
        talloc_set_name_const(child, "talloc_set destructor");
        talloc_set_destructor(child, talloc_destroy_pointer);
+
+set_ptr:
+       /* memcpy rather than cast avoids aliasing problems. */
+       memcpy(ptr, &p, sizeof(p));
 }
 
 /*
 }
 
 /*