On Sat, Jun 10, 2017 at 03:21:43AM +0000, Eric Wong wrote:

> > So make Jonathan's freez_impl a public API and rename it to
> > free_and_null(), perhaps?
> 
> Perhaps...  I think it needs to take "void *" to avoid warnings:
> 
>       static inline void free_and_null(void *ptrptr)
>       {
>               void **tmp = ptrptr;
> 
>               free(*tmp);
>               *tmp = NULL;
>       }

That unfortunately makes it very easy to get it wrong in the callers.
Both:

  free_and_null(&p);

and

  free_and_null(p);

would be accepted by the compiler, but one of them causes undefined
behavior.

Unfortunately using "void **" in the declaration doesn't work, because
C's implicit casting rules don't apply to pointer-to-pointer types.

-Peff

Reply via email to