Signed-off-by: Jie Yang <yangjieyj.yang@huawei.com> (cherry picked from commit 76b5920296ad84c4886f39335adc5471d49418d3)
48 lines
1.8 KiB
Diff
48 lines
1.8 KiB
Diff
From 03fe93ad1f5a5d8f3a132ea419e4a509069e2130 Mon Sep 17 00:00:00 2001
|
||
From: ace yan <yan_ace62@126.com>
|
||
Date: Sun, 20 Feb 2022 14:57:34 +0800
|
||
Subject: [PATCH 01/10] Implement a safe offset_of macro function
|
||
MIME-Version: 1.0
|
||
Content-Type: text/plain; charset=UTF-8
|
||
Content-Transfer-Encoding: 8bit
|
||
|
||
Original offset_of macro implementation reference to packed field is unaligned,
|
||
and creating a misaligned reference is undefined behavior。
|
||
In the higher version of the rustc compiler,
|
||
there will be a compilation warning prompt: this was previously accepted by the compiler
|
||
but is being phased out; it will become a hard error in a future release!
|
||
|
||
Signed-off-by: Yan Wen <yan_ace62@126.com>
|
||
---
|
||
util/src/offsetof.rs | 14 +++++++++++---
|
||
1 file changed, 11 insertions(+), 3 deletions(-)
|
||
|
||
diff --git a/util/src/offsetof.rs b/util/src/offsetof.rs
|
||
index c2696c8..a6b55d8 100644
|
||
--- a/util/src/offsetof.rs
|
||
+++ b/util/src/offsetof.rs
|
||
@@ -13,9 +13,17 @@
|
||
/// Macro: Calculate offset of specified field in a type.
|
||
#[macro_export]
|
||
macro_rules! __offset_of {
|
||
- ($type_name:ty, $field:ident) => {
|
||
- unsafe { &(*(std::ptr::null::<$type_name>())).$field as *const _ as usize }
|
||
- };
|
||
+ ($type_name:ty, $field:ident) => {{
|
||
+ let tmp = core::mem::MaybeUninit::<$type_name>::uninit();
|
||
+ let outer = tmp.as_ptr();
|
||
+ // Safe because the pointer is valid and aligned, just not initialised; `addr_of` ensures that
|
||
+ // we don't actually read from `outer` (which would be UB) nor create an intermediate reference.
|
||
+ let inner = unsafe { core::ptr::addr_of!((*outer).$field) } as *const u8;
|
||
+ // Safe because the two pointers are within the same allocation block.
|
||
+ unsafe {
|
||
+ inner.offset_from(outer as *const u8) as usize
|
||
+ }
|
||
+ }};
|
||
}
|
||
|
||
/// Macro: Calculate offset of a field in a recursive type.
|
||
--
|
||
2.25.1
|
||
|