diff options
| author | Peter Zhu <peter@peterzhu.ca> | 2025-12-06 10:37:56 -0500 |
|---|---|---|
| committer | Peter Zhu <peter@peterzhu.ca> | 2025-12-06 08:31:41 -0800 |
| commit | 2e828dd98feeec5bab5ea85f0661638524004a01 (patch) | |
| tree | b29c7e67f4def88ffd25d1753ce6d77dbfc97ee7 /io_buffer.c | |
| parent | da3b7d5ee3afb5ae8e97a906d114b56242a5ff27 (diff) | |
Fix strict aliasing warning in ruby_swap128_int
The following warnings are emitted. We can use type punning to prevent
strict aliasing violations.
io_buffer.c:1935:23: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
1935 | rb_uint128_t u = *(rb_uint128_t*)&x;
| ^~~~~~~~~~~~~~~~~
io_buffer.c:1937:13: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
1937 | return *(rb_int128_t*)&swapped;
|
Diffstat (limited to 'io_buffer.c')
| -rw-r--r-- | io_buffer.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/io_buffer.c b/io_buffer.c index 0d2cbdb4b7..b81527ff71 100644 --- a/io_buffer.c +++ b/io_buffer.c @@ -1928,13 +1928,19 @@ ruby_swap128_uint(rb_uint128_t x) return result; } +union uint128_int128_conversion { + rb_uint128_t uint128; + rb_int128_t int128; +}; + static inline rb_int128_t ruby_swap128_int(rb_int128_t x) { - // Cast to unsigned, swap, then cast back - rb_uint128_t u = *(rb_uint128_t*)&x; - rb_uint128_t swapped = ruby_swap128_uint(u); - return *(rb_int128_t*)&swapped; + union uint128_int128_conversion conversion = { + .int128 = x + }; + conversion.uint128 = ruby_swap128_uint(conversion.uint128); + return conversion.int128; } #define IO_BUFFER_DECLARE_TYPE(name, type, endian, wrap, unwrap, swap) \ |
