[glibc/azanella/ubsan-undef] stdlib: Fix UB in tst-limits.c

Adhemerval Zanella azanella@sourceware.org
Thu May 8 14:02:51 GMT 2025


https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=8ee1efc90d6b07c326af702f2c4231621b90434d

commit 8ee1efc90d6b07c326af702f2c4231621b90434d
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Date:   Wed Apr 23 12:37:16 2025 -0300

    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'

Diff:
---
 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


More information about the Glibc-cvs mailing list