Skip to content
  • Arnd Bergmann's avatar
    include/linux/bitrev.h: fix constant bitrev · ed031128
    Arnd Bergmann authored
    commit 6147e136 upstream.
    
    clang points out with hundreds of warnings that the bitrev macros have a
    problem with constant input:
    
      drivers/hwmon/sht15.c:187:11: error: variable '__x' is uninitialized when used within its own initialization
            [-Werror,-Wuninitialized]
              u8 crc = bitrev8(data->val_status & 0x0F);
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      include/linux/bitrev.h:102:21: note: expanded from macro 'bitrev8'
              __constant_bitrev8(__x) :                       \
              ~~~~~~~~~~~~~~~~~~~^~~~
      include/linux/bitrev.h:67:11: note: expanded from macro '__constant_bitrev8'
              u8 __x = x;                     \
                 ~~~   ^
    
    Both the bitrev and the __constant_bitrev macros use an internal
    variable named __x, which goes horribly wrong when passing one to the
    other.
    
    The obvious fix is to rename one of the variables, so this adds an extra
    '_'.
    
    It seems we got away with this because
    
     - there are only a few drivers using bitrev macros
    
     - usually there are no constant arguments to those
    
     - when they are constant, they tend to be either 0 or (unsigned)-1
       (drivers/isdn/i4l/isdnhdlc.o, drivers/iio/amplifiers/ad8366.c) and
       give the correct result by pure chance.
    
    In fact, the only driver that I could find that gets different results
    with this is drivers/net/wan/slic_ds26522.c, which in turn is a driver
    for fairly rare hardware (adding the maintainer to Cc for testing).
    
    Link: http://lkml.kernel.org/r/20190322140503.123580-1-arnd@arndb.de
    Fixes: 556d2f05
    
     ("ARM: 8187/1: add CONFIG_HAVE_ARCH_BITREVERSE to support rbit instruction")
    Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
    Reviewed-by: default avatarNick Desaulniers <ndesaulniers@google.com>
    Cc: Zhao Qiang <qiang.zhao@nxp.com>
    Cc: Yalin Wang <yalin.wang@sonymobile.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    ed031128