summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRusty Russell <rusty@rustcorp.com.au>2010-11-03 10:46:42 +1030
committerRusty Russell <rusty@rustcorp.com.au>2010-11-03 10:46:42 +1030
commite8dfb48ec9dd9a7575b179e8208cd2dd5c73bcce (patch)
tree83cede9c31da00bf6df31f20e50a04ab41916553
parent3fb6b6be5a395fbe293e61339e6be67118234508 (diff)
talloc: fix gcc -O3 aliasing warnings
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.
-rw-r--r--ccan/talloc/talloc.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/ccan/talloc/talloc.c b/ccan/talloc/talloc.c
index ed958a8e..1b96f90f 100644
--- a/ccan/talloc/talloc.c
+++ b/ccan/talloc/talloc.c
@@ -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 **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)) {
- 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);
+
+set_ptr:
+ /* memcpy rather than cast avoids aliasing problems. */
+ memcpy(ptr, &p, sizeof(p));
}
/*