A better way to deal with gcc's 'strict aliasing' warning
Alejandro Mery
amery at geeks.cl
Mon Dec 15 23:50:52 CET 2014
sorry for the noise... thunderbird decided to reorder the mails and I
didn't look at the date before replying :<
On 15.12.2014 23:45, Alejandro Mery wrote:
>
>
> On 30.07.2012 12:04, Jianbin Kang wrote:
>> Hello,
>>
>> In `ev.h', the macro using (type of ev_watch *)(void *)(ev) to
>> convert `ev' to a required type.
>> The (void *) conversion may be used to supress gcc's 'strict
>> aliasing' warning (not sure).
>> This may work in previous version of gcc, but failed with gcc
>> 4.7:
>> warning: dereferencing type-punned pointer will break
>> strict-aliasing rules [-Wstrict-aliasing]
>>
>> The better way is to put all ev_watch type to an union (such as
>> union ev_any_watcher in "ev.h"),
>> and convert the pointer to (union ev_any_watch *).
>> For example, the following code can supress strict-aliasing
>> warning for macro 'ev_init':
>> typedef ev_any_watcher ev_any;
>> #define ev_init(ev,cb_) do { \
>> ((ev_any *)(ev))->w.active = \
>> ((ev_any *)(ev))->w.pending = 0; \
>> ev_set_priority ((ev), 0); \
>> ev_set_cb ((ev), cb_); \
>> } while (0)
>> # define ev_set_priority(ev,pri) ( (ev_any
>> *)(ev))->w.priority = (pri)
>>
>>
>> Is there any suggestion?
>
> I usually reimplement ev_foo_init() macros the as static inline
> functions with explicit types, and then everything goes smoothly.
More information about the libev
mailing list