[PATCH] string: Add page tests for test-strncasecmp and test-strncpy
Raphael M Zinsly
rzinsly@linux.ibm.com
Tue Jun 2 14:08:34 GMT 2020
Hi Lucas,
On 02/06/2020 09:58, Lucas A. M. Magalhaes wrote:
> 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?
>
It's BUF1PAGES*page_size, it could be 1 or 20 pages long.
>> + 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.
Yes, I'll change this.
>> +
>> + s1 = (char *) buf1;
> I notice that o the other function you use (CHAR *) instead of (char *)
The other function also tests wide chars, CHAR can be char or wchar_t.
>> + 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?
>
Yes, on aarch64 the MIN_PAGE_SIZE can be 16 if compiled with
-DTEST_PAGE_CROSS.
>> + 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
>
Thanks,
--
Raphael Moreira Zinsly
IBM
Linux on Power Toolchain
More information about the Libc-alpha
mailing list