[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