Re: [PATCH v2 1/2] git-compat-util: add a FREEZ() wrapper around free(ptr); ptr = NULL
- From
Jeff King <peff@peff.net>
- Date
- Jun 10, 2017, 07:25 UTC
- Message-ID
- <20170610072506.embaavscstmjnv6v@sigill.intra.peff.net>
- In-Reply-To
- <20170610032143.GA7880@starla>
On Sat, Jun 10, 2017 at 03:21:43AM +0000, Eric Wong wrote:
Show 12 quoted lines
> > 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