[ccan] why add the result of check_type in container_of
David Gibson
david at gibson.dropbear.id.au
Wed Mar 14 12:18:49 AEDT 2018
On Mon, Mar 12, 2018 at 11:19:39AM +0800, Yubin Ruan wrote:
> Hi,
>
> I notice that in the implementation of container_of(), the resulting pointer
> will be advanced by 1 if types mismatch:
>
> #define container_of(member_ptr, containing_type, member) \
> ((containing_type *) \
> ((char *)(member_ptr) \
> - container_off(containing_type, member)) \
> + check_types_match(*(member_ptr), ((containing_type *)0)->member))
>
> where check_types_match() is defined as
>
> #define check_types_match(expr1, expr2) \
> ((typeof(expr1) *)0 != (typeof(expr2) *)0)
>
> which will return 1 if types mismatch.
No.. it won't, it will have a type error. That's not typeof(x) ==
typeof(y), which isn't valid C (or gcc) in any case. It's checking if
NULL (0) cast to the first pointer type equals NULL cast to the second
pointer type. If the types mismatch, there will be a type error.
> IMO, advancing the wrong pointer (resulting from mismatch types) by 1 will
> only make things worse, and users usually only get garbage results and will not
> be aware of the type-mismatch bug. Wouldn't it be better to throw an building
> error/warning for that?
--
David Gibson | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://lists.ozlabs.org/pipermail/ccan/attachments/20180314/3577fd59/attachment.sig>
More information about the ccan
mailing list