1748211 Members
4857 Online
108759 Solutions
New Discussion юеВ

type-punned pointers!?

 
Henrik Goldman
Occasional Contributor

type-punned pointers!?

Hi,

I'm seeing a weird problem on hp-ux (ia64) using g++ 4.1.1.


Here below is a tiny bit of code which sets up the nessecary code for doing
a select():


fd_set fdread, fdwrite;


FD_ZERO(&fdread);


FD_ZERO(&fdwrite);


FD_SET(m_IncomingSocket.GetSocket(), &fdread);


FD_SET(m_IncomingSocket.GetSocket(), &fdwrite);


For the last two lines I get the following warning:


warning: dereferencing type-punned pointer will break strict-aliasing rules
warning: dereferencing type-punned pointer will break strict-aliasing rules


I don't really understand why 'clean' code would give such a warning since
it's structures which are defined by the system.
However perhaps someone could tell me what it actually means and eventually
how to solve it? My g++ optimization is O2.


Thanks in advance.
-- Henrik
2 REPLIES 2
Dennis Handly
Acclaimed Contributor

Re: type-punned pointers!?

>I don't really understand why 'clean' code would give such a warning since it's structures which are defined by the system.

The trouble is that the system headers think they can do anything but don't realize they break strict ANSI C rules. ;-)

You probably can ignore this. I don't know if there is a g++ option to suppress this. Or if the warning will tell g++ not to do that aliasing.
Henrik Goldman
Occasional Contributor

Re: type-punned pointers!?

Yes it seems it's a bug in the system headers.

For now I just fixed the header file /usr/include/sys/_fd_macros.h:

# define FD_SET(n,p) (((__fd_mask *)(void*)((p)->fds_bits))[(n)/_NFDBITS] |...
# define FD_CLR(n,p) (((__fd_mask *)(void*)((p)->fds_bits))[(n)/_NFDBITS] &=...
# define FD_ISSET(n,p) (((__fd_mask *)(void*)((p)->fds_bits))[(n)/_NFDBITS] ...


I have added "(void *)" on all 3 lines. I think it's because the cast is unsafe that I get the complain. On other platforms I'm sure the same thing would have issued "bus errors" which I have experienced in past.

-- Henrik