Re: [PATCH v2] rust: check type of `$ptr` in `container_of!`
From: Alice Ryhl
Date: Mon Apr 14 2025 - 10:36:03 EST
On Sat, Apr 12, 2025 at 02:16:08PM -0400, Tamir Duberstein wrote:
> + ($field_ptr:expr, $Container:ty, $($fields:tt)*) => {{
> + let offset: usize = ::core::mem::offset_of!($Container, $($fields)*);
> + let container_ptr = $field_ptr.byte_sub(offset).cast::<$Container>();
> + if false {
> + let field_ptr = ::core::ptr::addr_of!((*container_ptr).$($fields)*).cast_mut();
> + [$field_ptr, field_ptr]; // typeof(`$ptr_to_field`) == typeof(`$Container.$($fields)*`)
This evaluates $field_ptr twice. The `if false` avoids bad stuff if the
expression has side-effects, but still seems sub-optimal.
Alice