lib: test_scanf: Remove pointless use of type_min() with unsigned types
authorRichard Fitzgerald <rf@opensource.cirrus.com>
Tue, 25 May 2021 12:20:11 +0000 (13:20 +0100)
committerPetr Mladek <pmladek@suse.com>
Thu, 27 May 2021 13:38:03 +0000 (15:38 +0200)
sparse was producing warnings of the form:

 sparse: cast truncates bits from constant value (ffff0001 becomes 1)

There is no actual problem here. Using type_min() on an unsigned type
results in an (expected) truncation.

However, there is no need to test an unsigned value against type_min().
The minimum value of an unsigned is obviously 0, and any value cast to
an unsigned type is >= 0, so for unsigneds only type_max() need be tested.

This patch also takes the opportunity to clean up the implementation of
simple_numbers_loop() to use a common pattern for the positive and
negative test.

Reported-by: kernel test robot <lkp@intel.com>
Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
Reviewed-by: Petr Mladek <pmladek@suse.com>
Signed-off-by: Petr Mladek <pmladek@suse.com>
Link: https://lore.kernel.org/r/20210525122012.6336-2-rf@opensource.cirrus.com
lib/test_scanf.c

index 8d577aec6c28539600aac08d76cb1b4562584d70..48ff5747a4da00332db69381797951a0abf93460 100644 (file)
@@ -187,8 +187,8 @@ static const unsigned long long numbers[] __initconst = {
 #define value_representable_in_type(T, val)                                     \
 (is_signed_type(T)                                                              \
        ? ((long long)(val) >= type_min(T)) && ((long long)(val) <= type_max(T)) \
-       : ((unsigned long long)(val) >= type_min(T)) &&                          \
-         ((unsigned long long)(val) <= type_max(T)))
+       : ((unsigned long long)(val) <= type_max(T)))
+
 
 #define test_one_number(T, gen_fmt, scan_fmt, val, fn)                 \
 do {                                                                   \
@@ -204,12 +204,11 @@ do {                                                                      \
        int i;                                                          \
                                                                        \
        for (i = 0; i < ARRAY_SIZE(numbers); i++) {                     \
-               if (!value_representable_in_type(T, numbers[i]))        \
-                       continue;                                       \
-                                                                       \
-               test_one_number(T, gen_fmt, scan_fmt, numbers[i], fn);  \
+               if (value_representable_in_type(T, numbers[i]))         \
+                       test_one_number(T, gen_fmt, scan_fmt,           \
+                                       numbers[i], fn);                \
                                                                        \
-               if (is_signed_type(T))                                  \
+               if (value_representable_in_type(T, -numbers[i]))        \
                        test_one_number(T, gen_fmt, scan_fmt,           \
                                        -numbers[i], fn);               \
        }                                                               \