diff options
| author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2025-04-23 12:37:16 -0300 |
|---|---|---|
| committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2025-04-25 17:46:06 -0300 |
| commit | 5f1b649e4a6dd6281ad39f545a6a8b3a0704d581 (patch) | |
| tree | b97885f6227b45cb445d75df05b8e494cfcae2f9 | |
| parent | cbc2b52ac0c331291dbd0e50f75822c0e8a21874 (diff) | |
| download | glibc-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.c | 16 |
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 |
