[PATCH 7/9] include: Upgrade <linux/typecheck.h>

Pierre-Clément Tosi ptosi at google.com
Thu Mar 17 12:46:36 CET 2022


On Wed, Mar 16, 2022 at 01:23:38PM -0600, Simon Glass wrote:
> Hi,
> 
> On Wed, 16 Mar 2022 at 09:41, Pierre-Clément Tosi <ptosi at google.com> wrote:
> >
> > Upgrade the header to version 5.16 of the kernel:
> >
> >     commit df0cc57e057f18e44dac8e6c18aba47ab53202f9
> >
> > Signed-off-by: Pierre-Clément Tosi <ptosi at google.com>
> > Cc: Simon Glass <sjg at chromium.org>
> > Cc: Tom Rini <trini at konsulko.com>
> > ---
> >  include/linux/typecheck.h | 10 ++++++++++
> >  1 file changed, 10 insertions(+)
> 
> Reviewed-by: Simon Glass <sjg at chromium.org>
> 
> But I don't understand how this works at all. Could you add a comment?

This patch is a simple upgrade of the header. I needed it for another patch
stack and, given how trivial and self-contained it is, I thought I would slip it
into this one.

If your "this" refers to the macro itself, an error should be generated by the
compiler when dereferencing a non-pointer and it avoids introducing side effects
through the use of __dummy but I'm not sure what the sizeof is there for; is it
perhaps compliant for an implementation to keep generating code when
encountering a dereferenced non-pointer (leading to a bogus result, from UB) so
that sizeof forces it to depend on that expression being of a valid type? Or is
it to do with catching variables of incomplete type e.g. arrays of unknown size?
It was introduced by commit cb0f80039fb7 ("bitops: Add non-atomic bitops for
pointers"), which doesn't provide much information either.

> 
> >
> > diff --git a/include/linux/typecheck.h b/include/linux/typecheck.h
> > index eb5b74a575..46b15e2aae 100644
> > --- a/include/linux/typecheck.h
> > +++ b/include/linux/typecheck.h
> > @@ -1,3 +1,4 @@
> > +/* SPDX-License-Identifier: GPL-2.0 */
> >  #ifndef TYPECHECK_H_INCLUDED
> >  #define TYPECHECK_H_INCLUDED
> >
> > @@ -21,4 +22,13 @@
> >         (void)__tmp; \
> >  })
> >
> > +/*
> > + * Check at compile time that something is a pointer type.
> > + */
> > +#define typecheck_pointer(x) \
> > +({     typeof(x) __dummy; \
> > +       (void)sizeof(*__dummy); \
> > +       1; \
> > +})
> > +
> >  #endif         /* TYPECHECK_H_INCLUDED */
> > --
> > 2.35.1.723.g4982287a31-goog
> >
> 
> Regards,
> Simon

-- 
Pierre


More information about the U-Boot mailing list