[Spice-devel] [PATCH spice-server 1/3] event-loop: Avoid possible compiler warning
Frediano Ziglio
fziglio at redhat.com
Thu May 10 16:47:55 UTC 2018
>
> On Sun, 2018-05-06 at 12:10 +0100, Frediano Ziglio wrote:
> > With GCC 8.0.1 (Fedora 28), cast to different function pointer
> > can lead to warnings.
> > As g_source_set_callback expect a function pointer which type
> > changes based on the type of source (so is expected) silent
> > the possible warning.
>
> Can you share an example of the warning. I'm not sure it needs to be in
> the log, but I'm curious to see what it looks like.
>
The error is
event-loop.c: In function ‘watch_update_mask’:
event-loop.c:146:42: error: cast between incompatible function types from ‘gboolean (*)(GIOChannel *, GIOCondition, void *)’ {aka ‘int (*)(struct _GIOChannel *, enum <anonymous>, void *)’} to ‘gboolean (*)(void *)’ {aka ‘int (*)(void *)’} [-Werror=cast-function-type]
g_source_set_callback(watch->source, (GSourceFunc)watch_func, watch, NULL);
^
cc1: all warnings being treated as errors
I'll add it to the comment
> >
> > Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> > ---
> > server/event-loop.c | 7 ++++++-
> > 1 file changed, 6 insertions(+), 1 deletion(-)
> >
> > diff --git a/server/event-loop.c b/server/event-loop.c
> > index 582782e1..d3b7de1b 100644
> > --- a/server/event-loop.c
> > +++ b/server/event-loop.c
> > @@ -143,7 +143,12 @@ static void watch_update_mask(const
> > SpiceCoreInterfaceInternal *iface,
> > return;
> >
> > watch->source = g_io_create_watch(watch->channel,
> > spice_event_to_giocondition(event_mask));
> > - g_source_set_callback(watch->source, (GSourceFunc)watch_func,
> > watch, NULL);
> > + /* g_source_set_callback() documentation says:
> > + * "The exact type of func depends on the type of source; ie.
> > you should
> > + * not count on func being called with data as its first
> > parameter."
> > + * In this case is a GIOFunc. First cast (GIOFunc) make sure is
> > the right type,
>
> I don't understand how casting to (GIOFunc) makes sure that the
> function is the right type. Do you just mean that gcc 8.x will complain
> if you try to cast it to (GIOFunc) and it is not actually a GIOFunc?
>
It checks some details like number of arguments.
But for instance is fine with different pointers.
At the end we are forcing the type so needs to allows something.
> > + * other casts make possible warning silent */
> > + g_source_set_callback(watch->source,
> > (GSourceFunc)(void*)(GIOFunc)watch_func, watch, NULL);
> > g_source_attach(watch->source, watch->context);
> > }
> >
>
Frediano
More information about the Spice-devel
mailing list