Browse Source

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.
Rusty Russell 15 years ago
parent
commit
e8dfb48ec9
1 changed files with 13 additions and 9 deletions
  1. 13 9
      ccan/talloc/talloc.c

+ 13 - 9
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));
 }
 
 /*