stdlib: Avoid undefined behavior in stdlib/tst-labs

The last loop could attempt to overflow beyond INT_MAX on 32-bit
architectures.

Also switch to GNU style.

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
This commit is contained in:
Florian Weimer 2023-05-16 23:26:40 +02:00
parent 8812b9900e
commit 10a81dd4cf

View File

@ -25,25 +25,26 @@
static int do_test (void) static int do_test (void)
{ {
long i; long int i;
TEST_COMPARE(labs(LONG_MAX), LONG_MAX); TEST_COMPARE (labs (LONG_MAX), LONG_MAX);
TEST_COMPARE(labs(LONG_MIN + 1), LONG_MAX); TEST_COMPARE (labs (LONG_MIN + 1), LONG_MAX);
TEST_COMPARE(labs(-1), 1); TEST_COMPARE (labs (-1), 1);
TEST_COMPARE(labs(0), 0); TEST_COMPARE (labs (0), 0);
TEST_COMPARE(labs(1), 1); TEST_COMPARE (labs (1), 1);
for (i = LONG_MIN + 1; i < LONG_MIN + INT_MAX; i += LARGE_PRIME) for (i = LONG_MIN + 1; i < LONG_MIN + INT_MAX; i += LARGE_PRIME)
TEST_COMPARE(labs(i), -i); TEST_COMPARE (labs (i), -i);
for (i = LONG_MAX - INT_MAX; i < LONG_MAX - LARGE_PRIME; i += LARGE_PRIME) for (i = LONG_MAX - INT_MAX; i < LONG_MAX - LARGE_PRIME;
TEST_COMPARE(labs(i), i); i += LARGE_PRIME)
TEST_COMPARE (labs (i), i);
for (i = INT_MIN + 1; i < 0; i += LARGE_PRIME) for (i = INT_MIN + 1; i < 0; i += LARGE_PRIME)
TEST_COMPARE(labs(i), -i); TEST_COMPARE (labs (i), -i);
for (i = 0; i < INT_MAX; i += LARGE_PRIME) for (i = 0; i <= INT_MAX - LARGE_PRIME; i += LARGE_PRIME)
TEST_COMPARE(labs(i), i); TEST_COMPARE (labs (i), i);
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }