All of lore.kernel.org
 help / color / mirror / Atom feed
From: Rikard Falkeborn <rikard.falkeborn@gmail.com>
To: Andy Shevchenko <andy.shevchenko@gmail.com>
Cc: Rikard Falkeborn <rikard.falkeborn@gmail.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Arnd Bergmann <arnd@arndb.de>,
	emil.l.velikov@gmail.com, Kees Cook <keescook@chromium.org>,
	Linus Walleij <linus.walleij@linaro.org>,
	Linux-Arch <linux-arch@vger.kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Syed Nayyar Waris <syednwaris@gmail.com>,
	William Breathitt Gray <vilhelm.gray@gmail.com>,
	Masahiro Yamada <yamada.masahiro@socionext.com>,
	kbuild test robot <lkp@intel.com>
Subject: Re: [PATCH] linux/bits.h: fix unsigned less than zero warnings
Date: Fri, 5 Jun 2020 01:30:03 +0200	[thread overview]
Message-ID: <20200604233003.GA102768@rikard> (raw)
In-Reply-To: <CAHp75VcNVOF6jHZ7gtpqskg9rDgwt3MmtGZJJOXE-GwvXRPOhw@mail.gmail.com>

On Thu, Jun 04, 2020 at 09:41:29AM +0300, Andy Shevchenko wrote:
> On Thu, Jun 4, 2020 at 1:03 AM Rikard Falkeborn
> <rikard.falkeborn@gmail.com> wrote:
> >
> > When calling the GENMASK and GENMASK_ULL macros with zero lower bit and
> > an unsigned unknown high bit, some gcc versions warn due to the
> > comparisons of the high and low bit in GENMASK_INPUT_CHECK.
> >
> > To silence the warnings, cast the inputs to int before doing the
> > comparisons. The only valid inputs to GENMASK() and GENMASK_ULL() are
> > are 0 to 31 or 63. Anything outside this is undefined due to the shifts
> > in GENMASK()/GENMASK_ULL(). Therefore, casting the inputs to int do not
> > change the values for valid known inputs. For unknown values, the check
> > does not change anything since it's a compile-time check only.
> >
> > As an example of the warning, kindly reported by the kbuild test robot:
> >
> > from drivers/mfd/atmel-smc.c:11:
> > drivers/mfd/atmel-smc.c: In function 'atmel_smc_cs_encode_ncycles':
> > include/linux/bits.h:26:28: warning: comparison of unsigned expression < 0 is always false [-Wtype-limits]
> > 26 |   __builtin_constant_p((l) > (h)), (l) > (h), 0)))
> > |                            ^
> > include/linux/build_bug.h:16:62: note: in definition of macro 'BUILD_BUG_ON_ZERO'
> > 16 | #define BUILD_BUG_ON_ZERO(e) ((int)(sizeof(struct { int:(-!!(e)); })))
> > |                                                              ^
> > include/linux/bits.h:39:3: note: in expansion of macro 'GENMASK_INPUT_CHECK'
> > 39 |  (GENMASK_INPUT_CHECK(h, l) + __GENMASK(h, l))
> > |   ^~~~~~~~~~~~~~~~~~~
> > >> drivers/mfd/atmel-smc.c:49:25: note: in expansion of macro 'GENMASK'
> > 49 |  unsigned int lsbmask = GENMASK(msbpos - 1, 0);
> > |                         ^~~~~~~
> >
> 
> Thank you for the patch!
> 
> I think there is still a possibility to improve (as I mentioned there
> are test cases that are absent right now).
> What if we will have unsigned long value 0x100000001? Would it be 1
> after casting?
> 
> Maybe cast to (long) or (long long) more appropriate?

It you're entering 0x10000001 you're going to get a compiler warning
since it's going to be shifted out of range, when I wrote the check I
figured that should be enough, but perhaps I was wrong?

How about requiring both l and h bit to be constant? (that's
arguably the way I should have written in the first place). That's going
to remove the warnings for GENMASK(x, 0). It will not work as expected
when mixing negative and unsigned input, like GENMASK(-1, 0u) is not
going to fail the build while GENMASK(1u, -1) will. For GENMASK(-1, 0u),
you will get a compiler warning due to the shifts in GENMASK.

If we need to handle the negative inputs as well. I think I'd prefer to add
explicit checks for negative values over the casting. A macro for that
can probably be reused in other places as well.

> 
> Please, add test cases.

Will do.

Rikard
> 
> > Fixes: 295bcca84916 ("linux/bits.h: add compile time sanity check of GENMASK inputs")
> > Reported-by: kbuild test robot <lkp@intel.com>
> > Reported-by: Emil Velikov <emil.l.velikov@gmail.com>
> > Reported-by: Syed Nayyar Waris <syednwaris@gmail.com>
> > Signed-off-by: Rikard Falkeborn <rikard.falkeborn@gmail.com>
> > ---
> >  include/linux/bits.h | 3 ++-
> >  1 file changed, 2 insertions(+), 1 deletion(-)
> >
> > diff --git a/include/linux/bits.h b/include/linux/bits.h
> > index 4671fbf28842..293d1ee71a48 100644
> > --- a/include/linux/bits.h
> > +++ b/include/linux/bits.h
> > @@ -21,9 +21,10 @@
> >  #if !defined(__ASSEMBLY__) && \
> >         (!defined(CONFIG_CC_IS_GCC) || CONFIG_GCC_VERSION >= 49000)
> >  #include <linux/build_bug.h>
> > +/* Avoid Wtype-limits warnings by casting the inputs to int */
> >  #define GENMASK_INPUT_CHECK(h, l) \
> >         (BUILD_BUG_ON_ZERO(__builtin_choose_expr( \
> > -               __builtin_constant_p((l) > (h)), (l) > (h), 0)))
> > +               __builtin_constant_p((int)(l) > (int)(h)), (int)(l) > (int)(h), 0)))
> >  #else
> >  /*
> >   * BUILD_BUG_ON_ZERO is not available in h files included from asm files,
> > --
> > 2.27.0
> >
> 
> 
> -- 
> With Best Regards,
> Andy Shevchenko

  parent reply	other threads:[~2020-06-04 23:30 UTC|newest]

Thread overview: 74+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-24  5:00 [PATCH v7 0/4] Introduce the for_each_set_clump macro Syed Nayyar Waris
2020-05-24  5:00 ` Syed Nayyar Waris
2020-05-24  5:00 ` Syed Nayyar Waris
2020-05-24  5:00 ` Syed Nayyar Waris
2020-05-24  5:01 ` [PATCH v7 1/4] bitops: Introduce the " Syed Nayyar Waris
2020-05-24 14:44   ` kbuild test robot
2020-05-24 14:44     ` kbuild test robot
2020-05-29 18:08     ` Syed Nayyar Waris
2020-05-29 18:38       ` Andy Shevchenko
2020-05-29 18:38         ` Andy Shevchenko
2020-05-29 20:02         ` Syed Nayyar Waris
2020-05-29 21:31           ` William Breathitt Gray
2020-05-29 21:53             ` Syed Nayyar Waris
2020-05-29 21:42           ` Andy Shevchenko
2020-05-29 21:42             ` Andy Shevchenko
2020-05-29 22:07             ` Andy Shevchenko
2020-05-29 22:11             ` Syed Nayyar Waris
2020-05-29 22:19               ` Andy Shevchenko
2020-05-30  8:45                 ` Syed Nayyar Waris
2020-05-30  9:20                   ` Andy Shevchenko
2020-05-31  1:11                     ` Syed Nayyar Waris
2020-05-31 11:00                       ` Andy Shevchenko
2020-05-31 22:37                         ` Rikard Falkeborn
2020-06-01  0:31                           ` Syed Nayyar Waris
2020-06-01  8:33                           ` Andy Shevchenko
2020-06-02 19:01                             ` Rikard Falkeborn
2020-06-03  8:49                               ` Andy Shevchenko
2020-06-03 21:53                                 ` Rikard Falkeborn
2020-06-03 21:58                                   ` Andy Shevchenko
2020-06-03 21:59                                     ` Andy Shevchenko
2020-06-03 22:02                                   ` [PATCH] linux/bits.h: fix unsigned less than zero warnings Rikard Falkeborn
2020-06-04  6:41                                     ` Andy Shevchenko
2020-06-04 16:49                                       ` Joe Perches
2020-06-04 23:30                                       ` Rikard Falkeborn [this message]
2020-06-07 20:34                                         ` [PATCH v2 1/2] " Rikard Falkeborn
2020-06-07 20:34                                           ` [PATCH v2 2/2] bits: Add tests of GENMASK Rikard Falkeborn
2020-06-08  7:33                                             ` Geert Uytterhoeven
2020-06-08 18:42                                               ` Rikard Falkeborn
2020-06-08 22:18                                                 ` [PATCH v3 1/2] linux/bits.h: fix unsigned less than zero warnings Rikard Falkeborn
2020-06-08 22:18                                                   ` [PATCH v3 2/2] bits: Add tests of GENMASK Rikard Falkeborn
2020-06-09 14:11                                                     ` Andy Shevchenko
2020-06-21  4:36                                                     ` Andrew Morton
2020-06-21  5:42                                                       ` [PATCH v4 1/2] linux/bits.h: fix unsigned less than zero warnings Rikard Falkeborn
2020-06-21  5:42                                                         ` [PATCH v4 2/2] bits: Add tests of GENMASK Rikard Falkeborn
2021-04-22 19:40                                                           ` Nico Pache
2021-04-22 21:30                                                             ` Nico Pache
2020-07-09 12:30                                                         ` [PATCH v4 1/2] linux/bits.h: fix unsigned less than zero warnings Herbert Xu
2020-07-09 12:30                                                           ` Herbert Xu
2020-07-09 12:30                                                           ` Herbert Xu
2020-07-09 18:13                                                           ` Linus Torvalds
2020-07-10  6:38                                                             ` Herbert Xu
2020-06-15 19:52                                                   ` [PATCH v3 " Emil Velikov
2020-06-08  8:08                                             ` [PATCH v2 2/2] bits: Add tests of GENMASK Andy Shevchenko
2020-06-08  8:08                                               ` Andy Shevchenko
2020-06-08 18:44                                               ` Rikard Falkeborn
2020-06-08 11:09                                           ` [PATCH v2 1/2] linux/bits.h: fix unsigned less than zero warnings Andy Shevchenko
2020-05-24  5:04 ` [PATCH v7 2/4] lib/test_bitmap.c: Add for_each_set_clump test cases Syed Nayyar Waris
2020-05-30 19:20   ` kbuild test robot
2020-05-30 19:20     ` kbuild test robot
2020-06-04 20:42     ` Syed Nayyar Waris
2020-06-05 12:24       ` Andy Shevchenko
2020-06-05 12:24         ` Andy Shevchenko
2020-06-06 23:15         ` Syed Nayyar Waris
2020-06-08 13:18           ` Andy Shevchenko
2020-06-08 13:18             ` Andy Shevchenko
2020-06-10  5:38           ` Rong Chen
2020-06-10  5:38             ` Rong Chen
2020-05-24  5:05 ` [PATCH v7 3/4] gpio: thunderx: Utilize for_each_set_clump macro Syed Nayyar Waris
2020-05-24  5:06 ` [PATCH v7 4/4] gpio: xilinx: " Syed Nayyar Waris
2020-05-24  5:06   ` Syed Nayyar Waris
2020-05-25  9:36 ` [PATCH v7 0/4] Introduce the " Bartosz Golaszewski
2020-05-25  9:36   ` Bartosz Golaszewski
2020-06-15 12:46   ` Syed Nayyar Waris
2020-06-15 12:46     ` Syed Nayyar Waris

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200604233003.GA102768@rikard \
    --to=rikard.falkeborn@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=andy.shevchenko@gmail.com \
    --cc=arnd@arndb.de \
    --cc=emil.l.velikov@gmail.com \
    --cc=keescook@chromium.org \
    --cc=linus.walleij@linaro.org \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lkp@intel.com \
    --cc=syednwaris@gmail.com \
    --cc=vilhelm.gray@gmail.com \
    --cc=yamada.masahiro@socionext.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.