summaryrefslogtreecommitdiff
path: root/io_buffer.c
diff options
context:
space:
mode:
authorPeter Zhu <peter@peterzhu.ca>2025-12-06 10:37:56 -0500
committerPeter Zhu <peter@peterzhu.ca>2025-12-06 08:31:41 -0800
commit2e828dd98feeec5bab5ea85f0661638524004a01 (patch)
treeb29c7e67f4def88ffd25d1753ce6d77dbfc97ee7 /io_buffer.c
parentda3b7d5ee3afb5ae8e97a906d114b56242a5ff27 (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.c14
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) \