[PATCH v4] string: Adds tests for test-strncasecmp and test-strncpy
Raphael Moreira Zinsly
rzinsly@linux.ibm.com
Wed Jun 10 18:55:18 GMT 2020
A couple more changes based on Adhemerval's review, thanks.
Changes since v3:
- Using a cache line size of 64 if the system doesn't have meaningful
information on _SC_LEVEL1_DCACHE_LINESIZE.
- Using buf2 instead of a buf1 copy for s2 at
string/test-strncasecmp.c.
--- >8 ---
Adds tests to check if strings placed at page bondaries are
handled correctly by strncasecmp and strncpy similar to tests
for strncmp and strnlen.
---
string/test-strncasecmp.c | 43 +++++++++++++++++++++++++++++++++++++++
string/test-strncpy.c | 41 +++++++++++++++++++++++++++++++++++++
2 files changed, 84 insertions(+)
diff --git a/string/test-strncasecmp.c b/string/test-strncasecmp.c
index 6a9c27beae..63f6d59ef2 100644
--- a/string/test-strncasecmp.c
+++ b/string/test-strncasecmp.c
@@ -137,6 +137,48 @@ 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, offset, cacheline_size;
+ char *s1, *s2;
+ int exp_result;
+
+ offset = page_size - 1;
+ s1 = (char *) buf1;
+ s2 = (char *) buf2;
+ memset (s1, '\1', offset);
+ memset (s2, '\1', offset);
+ s1[offset] = '\0';
+ s2[offset] = '\0';
+
+ /* s2 has a fixed offset, half page long.
+ page_size is actually 2 * getpagesize. */
+ offset = page_size / 4;
+ s2 += offset;
+ /* Start offset for s1 at half of the second page. */
+ offset = 3 * page_size / 4;
+ s1 += offset;
+
+ /* Try to cross the page boundary at every offset of a cache line. */
+ cacheline_size = sysconf (_SC_LEVEL1_DCACHE_LINESIZE);
+ /* Use 64 as default. */
+ if(cacheline_size == 0)
+ cacheline_size = 64;
+ for (i = 0; i < cacheline_size; ++i)
+ {
+ 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);
+ }
+
+ s1++;
+ }
+}
+
static void
do_random_tests (void)
{
@@ -334,6 +376,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..051257f200 100644
--- a/string/test-strncpy.c
+++ b/string/test-strncpy.c
@@ -155,6 +155,46 @@ 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, small_len, big_len, short_offset, long_offset, cacheline_size;
+ 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';
+
+ long_offset = (last_offset + 1) / 2;
+ short_offset = last_offset;
+
+ /* Try to cross the page boundary at every offset of a cache line. */
+ cacheline_size = sysconf (_SC_LEVEL1_DCACHE_LINESIZE);
+ /* Use 64 as default. */
+ if(cacheline_size == 0)
+ cacheline_size = 64;
+ for (i = 0; i < cacheline_size; i++)
+ {
+ /* Place long strings ending at page boundary. */
+ long_offset++;
+ big_len = last_offset - long_offset;
+ /* Place short strings ending at page boundary. */
+ short_offset--;
+ small_len = last_offset - short_offset;
+
+ FOR_EACH_IMPL (impl, 0)
+ {
+ do_one_test (impl, s2, (CHAR *) (s1 + short_offset), small_len,
+ small_len);
+ do_one_test (impl, s2, (CHAR *) (s1 + long_offset), page_size,
+ big_len);
+ }
+ }
+}
+
static void
do_random_tests (void)
{
@@ -317,6 +357,7 @@ test_main (void)
}
do_random_tests ();
+ do_page_tests ();
return ret;
}
--
2.26.2
More information about the Libc-alpha
mailing list