[PATCH] string: Add page tests for test-strncasecmp and test-strncpy
Lucas A. M. Magalhaes
lamm@linux.ibm.com
Tue Jun 2 12:58:35 GMT 2020
Hi Raphael, Thanks for the patch :)
Overall it will be best if there was some comments for the magic numbers and
test functions. I think Paul point that.
Quoting Raphael Moreira Zinsly via Libc-alpha (2020-05-29 10:53:05)
> Adds tests to check if strings placed at page bondaries are
> handled correctly by strncasecmp and strncpy similar to tests
> for strncmp and strnlen. This should catch regressions in the
> optmized functions.
> ---
> string/test-strncasecmp.c | 39 +++++++++++++++++++++++++++++++++++++++
> string/test-strncpy.c | 37 +++++++++++++++++++++++++++++++++++++
> 2 files changed, 76 insertions(+)
>
> diff --git a/string/test-strncasecmp.c b/string/test-strncasecmp.c
> index 6a9c27beae..0399f37117 100644
> --- a/string/test-strncasecmp.c
> +++ b/string/test-strncasecmp.c
> @@ -137,6 +137,44 @@ do_test (size_t align1, size_t align2, size_t n, size_t len, int max_char,
> do_one_test (impl, s1, s2, n, exp_result);
> }
>
> +static void
> +do_page_tests (void)
> +{
> + size_t i, offset1, offset2;
> + char *s1, *s2, *s3;
> + int exp_result;
> +
> + s1 = (char *) buf1;
What is the size of buf1 1 page_size?
> + for (i = 0; i < page_size - 1; i++)
> + s1[i] = 23;
> + s1[i] = 0;
> +
> + s3 = strdup (s1);
> + offset2 = 2636;
> +
> + for (i = 0; i < 64; ++i)
> + {
> + offset1 = 3988 + i;
> +
The max size of offset1 is 4052. AFAIK this will never cross a page. So
the check bellow is not necessarie.
> + if (offset1 >= page_size
> + || offset2 >= page_size)
> + return;
Why do you check offset2 here? As it never increments you could check it
outside of the loop. But AFAIK 2636 will never cross a page.
> +
> + s1 = (char *) buf1;
I notice that o the other function you use (CHAR *) instead of (char *)
> + s2 = s3;
> + s1 += offset1;
Well, a sum is a sum. But Why don't use a simpler for like:
s1 = magic_number1 + buf1
s2 = magic_number2 + s3
for (i = 0; i < 64; ++i){
s1++;
s2++;
do test
{
> + s2 += offset2;
> +
> + exp_result= *s1;
> +
> + FOR_EACH_IMPL (impl, 0)
> + {
> + check_result (impl, s1, s2, page_size, -exp_result);
> + check_result (impl, s2, s1, page_size, exp_result);
> + }
> + }
> +}
> +
> static void
> do_random_tests (void)
> {
> @@ -334,6 +372,7 @@ test_locale (const char *locale)
> }
>
> do_random_tests ();
> + do_page_tests ();
> }
>
> int
> diff --git a/string/test-strncpy.c b/string/test-strncpy.c
> index c978753ad8..30c69dd34b 100644
> --- a/string/test-strncpy.c
> +++ b/string/test-strncpy.c
> @@ -155,6 +155,42 @@ do_test (size_t align1, size_t align2, size_t len, size_t n, int max_char)
> do_one_test (impl, s2, s1, len, n);
> }
>
> +static void
> +do_page_tests (void)
> +{
> + size_t i, len, start_offset, offset;
> + CHAR *s1, *s2;
> + /* Calculate the null character offset. */
> + size_t last_offset = (page_size / sizeof (CHAR)) - 1;
> +
> + s2 = (CHAR *) buf1;
> + s1 = (CHAR *) buf2;
> + MEMSET (s1, '\1', last_offset);
> + s1[last_offset] = '\0';
Ok.
> +
> + /* Place short strings ending at page boundary. */
> + offset = last_offset;
> + for (i = 0; i < 128; i++)
> + {
> + offset--;
> + len = last_offset - offset;
> + FOR_EACH_IMPL (impl, 0)
> + do_one_test (impl, s2, (CHAR *) (s1 + offset), len, len);
> + }
Ok.
> +
> + /* Place long strings ending at page boundary. */
> + start_offset = (last_offset + 1) / 2;
> + for (i = 0; i < 64; ++i)
> + {
> + offset = start_offset + i;
> + if (offset >= (last_offset + 1))
> + break;
Is this possible?
> + len = last_offset - offset;
> + FOR_EACH_IMPL (impl, 0)
> + do_one_test (impl, s2, (CHAR *) (s1 + offset), page_size, len);
> + }
> +}
> +
> static void
> do_random_tests (void)
> {
> @@ -317,6 +353,7 @@ test_main (void)
> }
>
> do_random_tests ();
> + do_page_tests ();
> return ret;
> }
>
> --
> 2.26.2
>
Ok.
---
Lucas A. M. Magalhães
More information about the Libc-alpha
mailing list