[Libguestfs] [PATCH nbdkit 1/2] include: Fix NBDKIT_HANDLE_NOT_NEEDED for C90 compilers.
Richard W.M. Jones
rjones at redhat.com
Fri Jan 18 14:47:02 UTC 2019
On Fri, Jan 18, 2019 at 08:36:07AM -0600, Eric Blake wrote:
> On 1/14/19 6:15 AM, Richard W.M. Jones wrote:
> > When an ANSI/C90 plugin compiled with ‘-pedantic’ uses
> > NBDKIT_HANDLE_NOT_NEEDED it gets the error:
> >
> > ISO C forbids conversion of function pointer to object pointer type
>
> While POSIX requires it to work. But such is life.
>
> >
> > This is because the existing macro worked by returning a function
> > pointer but in C90 function pointers cannot be cast to data pointers
> > since on some ancient architectures code and data pointers were
> > incompatible.
> >
> > We only need a convenient global data pointer here, and the address of
> > ‘errno’ should be fine.
>
> errno is often implemented as a dereference of a function call in order
> to get thread-safe semantics; for example, your patch produces
> '&(*__errno_location())' on glibc. That should be okay (especially
> since it silenced the warning).
Yeah, I was aware of this and looking for some other global variable
but couldn't think of one at the time.
Hmm, how about optind?
Rich.
> Another option, instead of referencing an actual variable, could be
> writing ((void*)(intptr_t)1).
>
> Either way, this patch makes sense.
>
> > @@ -78,7 +79,7 @@ extern char *nbdkit_realpath (const char *path);
> > /* A static non-NULL pointer which can be used when you don't need a
> > * per-connection handle.
> > */
> > -#define NBDKIT_HANDLE_NOT_NEEDED ((void *) &nbdkit_error)
> > +#define NBDKIT_HANDLE_NOT_NEEDED (&errno)
> >
> > #ifdef __cplusplus
> > }
> >
>
> --
> Eric Blake, Principal Software Engineer
> Red Hat, Inc. +1-919-301-3226
> Virtualization: qemu.org | libvirt.org
>
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-p2v converts physical machines to virtual machines. Boot with a
live CD or over the network (PXE) and turn machines into KVM guests.
http://libguestfs.org/virt-v2v
More information about the Libguestfs
mailing list