diff options
author | Zack Weinberg <zackw@panix.com> | 2017-06-08 15:39:03 -0400 |
---|---|---|
committer | Zack Weinberg <zackw@panix.com> | 2017-06-08 15:39:03 -0400 |
commit | 5046dbb4a7eba5eccfd258f92f4735c9ffc8d069 (patch) | |
tree | 4470480d904b65cf14ca524f96f79eca818c3eaf /string/tst-cmp.c | |
parent | 199fc19d3aaaf57944ef036e15904febe877fc93 (diff) | |
download | glibc-zack/build-layout-experiment.tar glibc-zack/build-layout-experiment.tar.gz glibc-zack/build-layout-experiment.tar.bz2 glibc-zack/build-layout-experiment.zip |
Prepare for radical source tree reorganization.zack/build-layout-experiment
All top-level files and directories are moved into a temporary storage
directory, REORG.TODO, except for files that will certainly still
exist in their current form at top level when we're done (COPYING,
COPYING.LIB, LICENSES, NEWS, README), all old ChangeLog files (which
are moved to the new directory OldChangeLogs, instead), and the
generated file INSTALL (which is just deleted; in the new order, there
will be no generated files checked into version control).
Diffstat (limited to 'string/tst-cmp.c')
-rw-r--r-- | string/tst-cmp.c | 212 |
1 files changed, 0 insertions, 212 deletions
diff --git a/string/tst-cmp.c b/string/tst-cmp.c deleted file mode 100644 index d7720194e9..0000000000 --- a/string/tst-cmp.c +++ /dev/null @@ -1,212 +0,0 @@ -/* Alignment/padding coverage test for string comparison. - Copyright (C) 2016-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -/* This performs test comparisons with various (mis)alignments and - characters in the padding. It is partly a regression test for bug - 20327. */ - -#include <limits.h> -#include <malloc.h> -#include <stdbool.h> -#include <stdint.h> -#include <stdlib.h> -#include <string.h> - -static int -signum (int val) -{ - if (val < 0) - return -1; - if (val > 0) - return 1; - else - return 0; -} - -static size_t -max_size_t (size_t left, size_t right) -{ - if (left > right) - return left; - else - return right; -} - -/* Wrappers for strncmp and strncasecmp which determine the maximum - string length in some, either based on the input string length, or - using fixed constants. */ - -static int -strncmp_no_terminator (const char *left, const char *right) -{ - size_t left_len = strlen (left); - size_t right_len = strlen (right); - return strncmp (left, right, max_size_t (left_len, right_len)); -} - -static int -strncasecmp_no_terminator (const char *left, const char *right) -{ - size_t left_len = strlen (left); - size_t right_len = strlen (right); - return strncasecmp (left, right, max_size_t (left_len, right_len)); -} - -static int -strncmp_terminator (const char *left, const char *right) -{ - size_t left_len = strlen (left); - size_t right_len = strlen (right); - return strncmp (left, right, max_size_t (left_len, right_len)); -} - -static int -strncasecmp_terminator (const char *left, const char *right) -{ - size_t left_len = strlen (left); - size_t right_len = strlen (right); - return strncasecmp (left, right, max_size_t (left_len, right_len)); -} - -static int -strncmp_64 (const char *left, const char *right) -{ - return strncmp (left, right, 64); -} - -static int -strncasecmp_64 (const char *left, const char *right) -{ - return strncasecmp (left, right, 64); -} - -static int -strncmp_max (const char *left, const char *right) -{ - return strncmp (left, right, SIZE_MAX); -} - -static int -strncasecmp_max (const char *left, const char *right) -{ - return strncasecmp (left, right, SIZE_MAX); -} - -int -do_test (void) -{ - enum { - max_align = 64, - max_string_length = 33 - }; - size_t blob_size = max_align + max_string_length + 1; - char *left = memalign (max_align, blob_size); - char *right = memalign (max_align, blob_size); - if (left == NULL || right == NULL) - { - printf ("error: out of memory\n"); - return 1; - } - - const struct - { - const char *name; - int (*implementation) (const char *, const char *); - } functions[] = - { - { "strcmp", strcmp }, - { "strcasecmp", strcasecmp }, - { "strncmp (without NUL)", strncmp_no_terminator}, - { "strncasecmp (without NUL)", strncasecmp_no_terminator}, - { "strncmp (with NUL)", strncmp_terminator}, - { "strncasecmp (with NUL)", strncasecmp_terminator}, - { "strncmp (length 64)", strncmp_64}, - { "strncasecmp (length 64)", strncasecmp_64}, - { "strncmp (length SIZE_MAX)", strncmp_max}, - { "strncasecmp (length SIZE_MAX)", strncasecmp_max}, - { NULL, NULL } - }; - const char *const strings[] = - { - "", - "0", - "01", - "01234567", - "0123456789abcde", - "0123456789abcdef", - "0123456789abcdefg", - "1", - "10", - "123456789abcdef", - "123456789abcdefg", - "23456789abcdef", - "23456789abcdefg", - "abcdefghijklmnopqrstuvwxyzABCDEF", - NULL - }; - const unsigned char pads[] = - { 0, 1, 32, 64, 128, '0', '1', 'e', 'f', 'g', 127, 192, 255 }; - - bool errors = false; - for (int left_idx = 0; strings[left_idx] != NULL; ++left_idx) - for (int left_align = 0; left_align < max_align; ++left_align) - for (unsigned pad_left = 0; pad_left < sizeof (pads); ++pad_left) - { - memset (left, pads[pad_left], blob_size); - strcpy (left + left_align, strings[left_idx]); - - for (int right_idx = 0; strings[right_idx] != NULL; ++right_idx) - for (unsigned pad_right = 0; pad_right < sizeof (pads); - ++pad_right) - for (int right_align = 0; right_align < max_align; - ++right_align) - { - memset (right, pads[pad_right], blob_size); - strcpy (right + right_align, strings[right_idx]); - - for (int func = 0; functions[func].name != NULL; ++func) - { - int expected = left_idx - right_idx; - int actual = functions[func].implementation - (left + left_align, right + right_align); - if (signum (actual) != signum (expected)) - { - printf ("error: mismatch for %s: %d\n" - " left: \"%s\"\n" - " right: \"%s\"\n" - " pad_left = %u, pad_right = %u,\n" - " left_align = %d, right_align = %d\n", - functions[func].name, actual, - strings[left_idx], strings[right_idx], - pad_left, pad_right, - left_align, right_align); - errors = true; - } - } - } - } - free (right); - free (left); - return errors; -} - -/* The nested loops need a long time to complete on slower - machines. */ -#define TIMEOUT 300 - -#include <support/test-driver.c> |