aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>2025-04-23 12:37:16 -0300
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>2025-04-25 17:46:06 -0300
commit5f1b649e4a6dd6281ad39f545a6a8b3a0704d581 (patch)
treeb97885f6227b45cb445d75df05b8e494cfcae2f9
parentcbc2b52ac0c331291dbd0e50f75822c0e8a21874 (diff)
downloadglibc-5f1b649e4a6dd6281ad39f545a6a8b3a0704d581.tar.xz
glibc-5f1b649e4a6dd6281ad39f545a6a8b3a0704d581.zip
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'
-rw-r--r--stdlib/tst-limits.c16
1 files 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