On Tue, 13 Oct 2026 20:31:46 +0000 Bill Wendling <[email protected]> wrote:
> The two parts of '__builtin_choose_expr()' had different arithmetic > expressions. This patch corrects it so that both parts calculate: > > COUNT * sizeof(*MEMBER) + __must_be_array(MEMBER) > > In practice, '__must_be_array' is meant to assert if 'MEMBER' isn't an > array and return '0' otherwise. However, symmetry is less prone to > subtle errors (and far more satisfying). > > Signed-off-by: Bill Wendling <[email protected]> > --- > v2: Don't use 'size_add', which just adds more complicated macro cruft to the > expression. Instead, just adjust the parentheses. > --- > include/linux/overflow.h | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/include/linux/overflow.h b/include/linux/overflow.h > index a8cb6319b4fb..d0f04436343e 100644 > --- a/include/linux/overflow.h > +++ b/include/linux/overflow.h > @@ -418,7 +418,7 @@ static __always_inline size_t __must_check > size_sub(size_t minuend, size_t subtr > #define flex_array_size(p, member, count) \ > __builtin_choose_expr(__is_constexpr(count), \ > (count) * sizeof(*(p)->member) + __must_be_array((p)->member), > \ > - size_mul(count, sizeof(*(p)->member) + > __must_be_array((p)->member))) > + size_mul(count, sizeof(*(p)->member)) + > __must_be_array((p)->member)) Why does this use __builtin_choose_expr(). The types of the two expressions are the same so it might as well use ?: Also doesn't this optimisation apply to all uses of size_mul() (aka saturating_mul()). Presumably relying on the compiler to report the compilation time numeric overflow. David > > /** > * struct_size() - Calculate size of structure with trailing flexible array.

