On Mon, Jun 25, 2018 at 11:26:05AM +0200, Rasmus Villemoes wrote: > On 24 June 2018 at 10:23, Leon Romanovsky <leon@xxxxxxxxxx> wrote: > > > From: Leon Romanovsky <leonro@xxxxxxxxxxxx> > > > > Add shift_overflow() helper to help driver authors to ensure that > > shift operand doesn't cause to overflow, which is very common pattern > > for RDMA drivers. > > > > Not a huge fan. The other _overflow functions have a different behaviour > (in how they return the result and the overflow status) and are > type-generic, and I think someone at some point will use such a > generically-named helper for stuff other than size_t. At least the > array_size and struct_size helpers have size in their name and are > specifically about computing the size of something, and are designed to be > used directly as arguments to allocators, where SIZE_MAX is a suitable > sentinel. I can't see the other patches in this series, so I don't know how > you plan on using it, but it should also be usable outside rdma. > > Aside: why does b have type size_t? > > Does __must_check really make sense for a function without side effects? It > doesn't tell gcc to warn if the result is not used in a conditional, it > just warns if the result is not used at all, which wouldn't realistically > happen for a pure function. > > I'd much rather see a type-generic check_shift_overflow (we can agree to > leave "left" out of the name) with semantics similar to the other > check_*_overflow functions. Then, if a size_t-eating, SIZE_MAX-returning > helper is more convenient for rdma, that should be easy to implement on top > of that. It shouldn't really be that hard to do. Something like > > check_shift_overflow(a, s, d) { > unsigned _nbits = 8*sizeof(a); > typeof(a) _a = (a); > typeof(s) _s = (s); > typeof(d) _d = (d); > > *_d = ((u64)(_a) << (_s & (_nbits-1))); > > _s >= _nbits || (_s > 0 && (_a >> (_nbits - _s - is_signed_type(a))) != > 0); > } > > which should also handle shifts of signed types (though it allows << 0 for > negative values; that's easy to also disallow). But the exact semantics > should be documented via a bunch of tests (hint hint) exercising corner > cases. I'll respin. Thanks for the feedback. > > Rasmus
Attachment:
signature.asc
Description: PGP signature