[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v11 3/9] xen: introduce DECLARE_BOUNDS



>>> On 06.03.19 at 21:55, <sstabellini@xxxxxxxxxx> wrote:
> On Wed, 6 Mar 2019, Jan Beulich wrote:
>> > +static inline ptrdiff_t name ## _bytediff(const type s1[],                
>> >     \
>> > +                                          const struct abstract_ ## name 
>> > s2[])\
>> > +{                                                                         
>> >     \
>> > +    BUILD_BUG_ON(alignof(*s1) != alignof(*s2));                           
>> >     \
>> > +    return (ptrdiff_t)((uintptr_t)s2 - (uintptr_t)s1);                    
>> >     \
>> > +}
>> 
>> What's the value of the intermediate casting to uintptr_t? Why not
>> cast to ptrdiff_t right away?
> 
> uintptr_t is the integer type corresponding to a pointer, so we should
> use uintptr_t first. ptrdiff_t is the difference type so we should cast
> to it afterwards. Specifically, uintptr_t is unsigned and ptrdiff_t is
> signed. So I don't think it would be correct to do:
> 
>   return (ptrdiff_t)((ptrdiff_t)s2 - (ptrdiff_t)s1);
> 
> Or am I missing your point?

Well, I really mean

   return (ptrdiff_t)s2 - (ptrdiff_t)s1;

But that aside - let's consider all three cases:

1) sizeof(ptrdiff_t) == sizeof(void *)

All fine. And you'll have some difficulty finding a platform where this
isn't the case.

2) sizeof(ptrdiff_t) > sizeof(void *)

Still all fine as long as the conversion void * -> ptrdiff_t doesn't differ
from the two step void * -> uintptr_t -> ptrdiff_t one. In fact in this
case yours would necessarily be wrong: You'd need to use intptr_t
instead, or else would-be-negative values wouldn't end up negative,
because the uintptr_t -> ptrdiff_t conversion is a zero extension then.
Whether my variant would suffer the same issue would depend on
whether void * -> ptrdiff_t is sign- or zero-extending.

Now if you went the intptr_t route, I'd be fine too, because then
again the outer cast can be dropped, which is all I'm after.

3) sizeof(ptrdiff_t) < sizeof(void *)

In this case neither variant will work for all possible pointer inputs.

Jan



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.