From 8ee1efc90d6b07c326af702f2c4231621b90434d Mon Sep 17 00:00:00 2001 From: Adhemerval Zanella Date: Wed, 23 Apr 2025 12:37:16 -0300 Subject: [PATCH] stdlib: Fix UB in tst-limits.c UBSAN: Undefined behaviour in tst-limits.c:14:16 left shift of 1 by 63 cannot be represented in type 'long long int' --- stdlib/tst-limits.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/stdlib/tst-limits.c b/stdlib/tst-limits.c index 9aabc360f6..310096005e 100644 --- a/stdlib/tst-limits.c +++ b/stdlib/tst-limits.c @@ -15,6 +15,14 @@ bitval (int bits) return val; } +static unsigned long long int +ubitval (int bits) +{ + unsigned long long int val = 0; + while (bits-- > 0) + val |= 1ull << bits; + return val; +} static int do_test (void) @@ -41,19 +49,19 @@ do_test (void) TEST (INT_MIN, "d", (int) -bitval (sizeof (int) * CHAR_BIT - 1) - 1); TEST (INT_MAX, "d", (int) bitval (sizeof (int) * CHAR_BIT - 1)); TEST (UINT_MAX, "u", - (unsigned int) bitval (sizeof (unsigned int) * CHAR_BIT)); + (unsigned int) ubitval (sizeof (unsigned int) * CHAR_BIT)); TEST (LONG_MIN, "ld", (long int) -bitval (sizeof (long int) * CHAR_BIT - 1) - 1); TEST (LONG_MAX, "ld", (long int) bitval (sizeof (long int) * CHAR_BIT - 1)); TEST (ULONG_MAX, "lu", - (unsigned long int) bitval (sizeof (unsigned long int) * CHAR_BIT)); + (unsigned long int) ubitval (sizeof (unsigned long int) * CHAR_BIT)); TEST (LLONG_MIN, "lld", -bitval (sizeof (long long int) * CHAR_BIT - 1) - 1); TEST (LLONG_MAX, "lld", bitval (sizeof (long long int) * CHAR_BIT - 1)); TEST (ULLONG_MAX, "llu", - (unsigned long long int) bitval (sizeof (unsigned long long int) - * CHAR_BIT)); + (unsigned long long int) ubitval (sizeof (unsigned long long int) + * CHAR_BIT)); /* Values from POSIX and Unix. */ #ifdef PAGESIZE -- 2.47.2