From 164e8c095e19af2595865d2713dd4d3d893b71e0 Mon Sep 17 00:00:00 2001 From: solar Date: Sun, 18 Jul 2010 12:05:46 +0000 Subject: [PATCH] Better size-safe checking for integer widths. --- functions/inttypes/strtoimax.c | 4 ++-- functions/inttypes/strtoumax.c | 6 ++++-- functions/stdio/printf_testcases.incl | 14 +++++++------- functions/stdlib/strtol.c | 4 ++-- functions/stdlib/strtoll.c | 4 ++-- functions/stdlib/strtoul.c | 6 ++++-- functions/stdlib/strtoull.c | 6 ++++-- 7 files changed, 25 insertions(+), 19 deletions(-) diff --git a/functions/inttypes/strtoimax.c b/functions/inttypes/strtoimax.c index 936389c..2d0fdf7 100755 --- a/functions/inttypes/strtoimax.c +++ b/functions/inttypes/strtoimax.c @@ -88,7 +88,7 @@ int main( void ) /* one-complement and signed magnitude just as well. Anyone having a */ /* platform to test this on? */ errno = 0; -#if INTMAX_MAX == 0x7fffffffffffffffLL +#if INTMAX_MAX >> 62 == 1 /* testing "even" overflow, i.e. base is power of two */ TESTCASE( strtoimax( "9223372036854775807", NULL, 0 ) == INTMAX_MAX ); TESTCASE( errno == 0 ); @@ -102,7 +102,7 @@ int main( void ) TESTCASE( strtoimax( "-9223372036854775809", NULL, 0 ) == INTMAX_MIN ); TESTCASE( errno == ERANGE ); /* TODO: test "odd" overflow, i.e. base is not power of two */ -#elif LLONG_MAX == 0x7fffffffffffffffffffffffffffffffLL +#elif LLONG_MAX >> 126 == 1 /* testing "even" overflow, i.e. base is power of two */ TESTCASE( strtoimax( "170141183460469231731687303715884105728", NULL, 0 ) == INTMAX_MAX ); TESTCASE( errno == 0 ); diff --git a/functions/inttypes/strtoumax.c b/functions/inttypes/strtoumax.c index 0da7ec2..9c9833e 100755 --- a/functions/inttypes/strtoumax.c +++ b/functions/inttypes/strtoumax.c @@ -76,14 +76,16 @@ int main( void ) TESTCASE( strtoumax( overflow, &endptr, 0 ) == 0 ); TESTCASE( endptr == overflow ); errno = 0; -#if UINTMAX_MAX == 0xffffffffffffffffLL +/* uintmax_t -> long long -> 64 bit */ +#if UINTMAX_MAX >> 63 == 1 /* testing "even" overflow, i.e. base is power of two */ TESTCASE( strtoumax( "18446744073709551615", NULL, 0 ) == UINTMAX_MAX ); TESTCASE( errno == 0 ); TESTCASE( strtoumax( "18446744073709551616", NULL, 0 ) == UINTMAX_MAX ); TESTCASE( errno == ERANGE ); /* TODO: test "odd" overflow, i.e. base is not power of two */ -#elif UINTMAX_MAX == 0xffffffffffffffffffffffffffffffffLL +/* uintmax_t -> long long -> 128 bit */ +#elif UINTMAX_MAX >> 127 == 1 /* testing "even" overflow, i.e. base is power of two */ TESTCASE( strtoumax( "340282366920938463463374607431768211455", NULL, 0 ) == UINTMAX_MAX ); TESTCASE( errno == 0 ); diff --git a/functions/stdio/printf_testcases.incl b/functions/stdio/printf_testcases.incl index 432d1e2..a421ca6 100644 --- a/functions/stdio/printf_testcases.incl +++ b/functions/stdio/printf_testcases.incl @@ -1,18 +1,18 @@ { -#if UINT_MAX / 0xffffu == 1 +#if UINT_MAX >> 15 == 1 #define _PDCLIB_UINT_DIG 5 #define _PDCLIB_INT_DIG 5 #define _PDCLIB_INT_HEXDIG FFFF #define _PDCLIB_INT_hexdig ffff #define _PDCLIB_INT_OCTDIG 177777 -#elif UINT_MAX / 0xffffffffu == 1 +#elif UINT_MAX >> 31 == 1 #define _PDCLIB_UINT_DIG 10 #define _PDCLIB_INT_DIG 10 #define _PDCLIB_INT_HEXDIG FFFFFFFF #define _PDCLIB_INT_hexdig ffffffff #define _PDCLIB_INT_OCTDIG 37777777777 -#elif UINT_MAX / 0xffffffffffffffffu == 1 +#elif UINT_MAX >> 63 == 1 #define _PDCLIB_UINT_DIG 20 #define _PDCLIB_INT_DIG 19 #define _PDCLIB_INT_HEXDIG FFFFFFFFFFFFFFFF @@ -22,20 +22,20 @@ #error Unsupported width of 'int' (neither 16, 32, nor 64 bit). #endif -#if ULONG_MAX / 0xfffffffful == 1 +#if ULONG_MAX >> 31 == 1 #define _PDCLIB_ULONG_DIG 10 #define _PDCLIB_LONG_DIG 10 -#elif ULONG_MAX / 0xfffffffffffffffful == 1 +#elif ULONG_MAX >> 63 == 1 #define _PDCLIB_ULONG_DIG 20 #define _PDCLIB_LONG_DIG 19 #else #error Unsupported width of 'long' (neither 32 nor 64 bit). #endif -#if ULLONG_MAX / 0xffffffffffffffffull == 1 +#if ULLONG_MAX >> 63 == 1 #define _PDCLIB_ULLONG_DIG 20 #define _PDCLIB_LLONG_DIG 19 -#elif ULLONG_MAX / 0xffffffffffffffffffffffffffffffffull == 1 +#elif ULLONG_MAX >> 127 == 1 #define _PDCLIB_ULLONG_DIG 38 #define _PDCLIB_LLONG_DIG 38 #else diff --git a/functions/stdlib/strtol.c b/functions/stdlib/strtol.c index 085abbb..dce035e 100644 --- a/functions/stdlib/strtol.c +++ b/functions/stdlib/strtol.c @@ -88,7 +88,7 @@ int main( void ) /* for one-complement and signed magnitude just as well. Anyone having */ /* a platform to test this on? */ errno = 0; -#if LONG_MAX == 0x7fffffffL +#if LONG_MAX >> 30 == 1 /* testing "even" overflow, i.e. base is power of two */ TESTCASE( strtol( "2147483647", NULL, 0 ) == 0x7fffffff ); TESTCASE( errno == 0 ); @@ -105,7 +105,7 @@ int main( void ) TESTCASE( strtol( "-2147483649", NULL, 0 ) == LONG_MIN ); TESTCASE( errno == ERANGE ); /* TODO: test "odd" overflow, i.e. base is not power of two */ -#elif LONG_MAX == 0x7fffffffffffffffL +#elif LONG_MAX >> 62 == 1 /* testing "even" overflow, i.e. base is power of two */ TESTCASE( strtol( "9223372036854775807", NULL, 0 ) == 0x7fffffffffffffff ); TESTCASE( errno == 0 ); diff --git a/functions/stdlib/strtoll.c b/functions/stdlib/strtoll.c index b447691..41640a1 100644 --- a/functions/stdlib/strtoll.c +++ b/functions/stdlib/strtoll.c @@ -88,7 +88,7 @@ int main( void ) /* for one-complement and signed magnitude just as well. Anyone having */ /* a platform to test this on? */ errno = 0; -#if LLONG_MAX == 0x7fffffffffffffffLL +#if LLONG_MAX >> 62 == 1 /* testing "even" overflow, i.e. base is power of two */ TESTCASE( strtoll( "9223372036854775807", NULL, 0 ) == 0x7fffffffffffffff ); TESTCASE( errno == 0 ); @@ -102,7 +102,7 @@ int main( void ) TESTCASE( strtoll( "-9223372036854775809", NULL, 0 ) == LLONG_MIN ); TESTCASE( errno == ERANGE ); /* TODO: test "odd" overflow, i.e. base is not power of two */ -#elif LLONG_MAX == 0x7fffffffffffffffffffffffffffffffLL +#elif LLONG_MAX >> 126 == 1 /* testing "even" overflow, i.e. base is power of two */ TESTCASE( strtoll( "170141183460469231731687303715884105728", NULL, 0 ) == 0x7fffffffffffffffffffffffffffffff ); TESTCASE( errno == 0 ); diff --git a/functions/stdlib/strtoul.c b/functions/stdlib/strtoul.c index 5680297..4b2fd3d 100644 --- a/functions/stdlib/strtoul.c +++ b/functions/stdlib/strtoul.c @@ -79,7 +79,8 @@ int main( void ) /* for one-complement and signed magnitude just as well. Anyone having */ /* a platform to test this on? */ errno = 0; -#if ULONG_MAX == 0xffffffffL +/* long -> 32 bit */ +#if ULONG_MAX >> 31 == 1 /* testing "even" overflow, i.e. base is power of two */ TESTCASE( strtoul( "4294967295", NULL, 0 ) == ULONG_MAX ); TESTCASE( errno == 0 ); @@ -87,7 +88,8 @@ int main( void ) TESTCASE( strtoul( "4294967296", NULL, 0 ) == ULONG_MAX ); TESTCASE( errno == ERANGE ); /* TODO: test "odd" overflow, i.e. base is not power of two */ -#elif ULONG_MAX == 0xffffffffffffffffL +/* long -> 64 bit */ +#elif ULONG_MAX >> 63 == 1 /* testing "even" overflow, i.e. base is power of two */ TESTCASE( strtoul( "18446744073709551615", NULL, 0 ) == ULONG_MAX ); TESTCASE( errno == 0 ); diff --git a/functions/stdlib/strtoull.c b/functions/stdlib/strtoull.c index ca9dd19..a28bb45 100644 --- a/functions/stdlib/strtoull.c +++ b/functions/stdlib/strtoull.c @@ -76,14 +76,16 @@ int main( void ) TESTCASE( strtoull( overflow, &endptr, 0 ) == 0 ); TESTCASE( endptr == overflow ); errno = 0; -#if ULLONG_MAX == 0xffffffffffffffffLL +/* long long -> 64 bit */ +#if ULLONG_MAX >> 63 == 1 /* testing "even" overflow, i.e. base is power of two */ TESTCASE( strtoull( "18446744073709551615", NULL, 0 ) == ULLONG_MAX ); TESTCASE( errno == 0 ); TESTCASE( strtoull( "18446744073709551616", NULL, 0 ) == ULLONG_MAX ); TESTCASE( errno == ERANGE ); /* TODO: test "odd" overflow, i.e. base is not power of two */ -#elif ULLONG_MAX == 0xffffffffffffffffffffffffffffffffLL +/* long long -> 128 bit */ +#elif ULLONG_MAX >> 127 == 1 /* testing "even" overflow, i.e. base is power of two */ TESTCASE( strtoull( "340282366920938463463374607431768211455", NULL, 0 ) == ULLONG_MAX ); TESTCASE( errno == 0 ); -- 2.40.0