[zeromq-dev] Strict aliasing problem
Bjorn Reese
breese at mail1.stofanet.dk
Thu May 17 11:14:38 CEST 2012
I cannot compile the master branch with g++ 4.4 because of this commit:
https://github.com/zeromq/libzmq/commit/c995de65847d8a97dc75294fb1b9b6a057fd3c1d
I get errors like this:
options.cpp: In member function ‘int zmq::options_t::setsockopt(int,
const void*, size_t)’:
options.cpp:328:52: error: dereferencing type-punned pointer will break
strict-aliasing rules
Actually, these kind of errors is what the abovementioned commit is
trying to fix, but it did not get it right.
I can see three possible solutions:
1. As the only standards-compliant way "casting" between
pointer-to-object and pointer-to-function is through a union, the
zmq_monitor_fn type could be changed to something like:
typedef union
{
void *object;
void (*function)(void *s, int event, zmq_event_data_t *data);
} zmq_monitor_fn;
and the various places where the monitor function is used, must be
changed appropriately.
This is not a good solution because it creates an awkward API for
callback functions.
2. Add a separate zmq_setsockopt() that takes a pointer-to-function
instead of pointer-to-object.
It might be even better to add explicit getters and setters for the
various options, rather than having to rely on va_args to create a
"fake" overloading in C.
3. The problem with strict aliasining is more or less theoretical. Posix
requires that pointer-to-object and pointer-to-function must have the
same representation. We could therefore lower the strictness of the
aliasing checking for g++. I have attached a patch just in case.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: aliasing.diff
Type: text/x-patch
Size: 665 bytes
Desc: not available
URL: <https://lists.zeromq.org/pipermail/zeromq-dev/attachments/20120517/6fde00c6/attachment.bin>
More information about the zeromq-dev
mailing list