[Spice-devel] [spice-protocol PATCH v1 11/12] macros: fix alignment issue reported by clang

Frediano Ziglio fziglio at redhat.com
Thu Aug 6 04:37:20 PDT 2015


> 
> On Wed, Aug 05, 2015 at 02:23:25PM +0200, Victor Toso wrote:
> > char_device.c:131:52: warning: cast from 'uint8_t *'
> > (aka 'unsigned char *') to 'SpiceCharDeviceMsgToClientItem *'
> > (aka 'struct SpiceCharDeviceMsgToClientItem *')
> > increases required alignment from 1 to 8 [-Wcast-align]
> > 
> >  SpiceCharDeviceMsgToClientItem *msg_item = SPICE_CONTAINEROF(item,
> >                                             ^~~~~~~~~~~~~~~~~~~~~~~
> > 
> > ../spice-common/spice-protocol/spice/macros.h:142:6: note: expanded
> > from macro 'SPICE_CONTAINEROF'
> > 
> >  ((struct_type *)((uint8_t *)(ptr) - SPICE_OFFSETOF(struct_type, member)))
> >   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> > ---
> >  spice/macros.h | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> > 
> > diff --git a/spice/macros.h b/spice/macros.h
> > index dad029c..bc9b648 100644
> > --- a/spice/macros.h
> > +++ b/spice/macros.h
> > @@ -140,7 +140,7 @@
> >  #endif
> >  
> >  #define SPICE_CONTAINEROF(ptr, struct_type, member) \
> > -    ((struct_type *)((uint8_t *)(ptr) - SPICE_OFFSETOF(struct_type,
> > member)))
> > +    ((struct_type *)(void *)((uint8_t *)(ptr) -
> > SPICE_OFFSETOF(struct_type, member)))
> 
> For this one, you can rely on implicit cast from (void *) to any pointer
> type, ie make the macro
> 
> -    ((struct_type *)((uint8_t *)(ptr) - SPICE_OFFSETOF(struct_type,
> member)))
> +    ((void *)((uint8_t *)(ptr) - SPICE_OFFSETOF(struct_type, member)))
> 
> The alignement constraints of the returned struct should have been
> taken into consideration when it was allocated, so the warning here
> can be silenced as alignment should be right when casting back.
> 
> Christophe
> 

Note however that this patch does not allows code (perhaps ugly but currently
working) like

struct Point { int x, y };
Point pt = { 1, 2 };
int *x_p = &pt.x;
SPICE_CONTAINEROF(x_p, struct Point, x)->y = 4;

Frediano


More information about the Spice-devel mailing list