mirror of
https://github.com/zeromq/libzmq.git
synced 2025-02-23 07:12:47 +01:00
Problem: pointer union for zmq_msg_t is a hack
Solution: use compiler's alignment attributes instead which is clearer and less of a hack. Pointer alignment violations causing crashes on architectures such as sparc64 and aarch64. This also avoid triggering ABI checkers as the change is compatible even though applications that suffer from the bug should rebuild to take advantage of the fix.
This commit is contained in:
parent
2e9264354c
commit
df367a6682
@ -229,10 +229,21 @@ ZMQ_EXPORT int zmq_ctx_destroy (void *context);
|
||||
/* 0MQ message definition. */
|
||||
/******************************************************************************/
|
||||
|
||||
/* union here ensures correct alignment on architectures that require it, e.g.
|
||||
* SPARC
|
||||
/* Some architectures, like sparc64 and some variants of aarch64, enforce pointer
|
||||
* alignment and raise sigbus on violations. Make sure applications allocate
|
||||
* zmq_msg_t on addresses aligned on a pointer-size boundary to avoid this issue.
|
||||
*/
|
||||
typedef union zmq_msg_t {unsigned char _ [64]; void *p; } zmq_msg_t;
|
||||
typedef struct zmq_msg_t {
|
||||
#if defined (__GNUC__) || defined ( __INTEL_COMPILER) || \
|
||||
(defined (__SUNPRO_C) && __SUNPRO_C >= 0x590) || \
|
||||
(defined (__SUNPRO_CC) && __SUNPRO_CC >= 0x590)
|
||||
unsigned char _ [64] __attribute__ ((aligned (sizeof (void *))));
|
||||
#elif defined(_MSC_VER)
|
||||
__declspec (align (sizeof (void *))) unsigned char _ [64];
|
||||
#else
|
||||
unsigned char _ [64];
|
||||
#endif
|
||||
} zmq_msg_t;
|
||||
|
||||
typedef void (zmq_free_fn) (void *data, void *hint);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user