lib/test_string.c: add some testcases for strchr and strnchr
authorPeter Rosin <peda@axentia.se>
Tue, 16 Jul 2019 23:27:21 +0000 (16:27 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 17 Jul 2019 02:23:22 +0000 (19:23 -0700)
Make sure that the trailing NUL is considered part of the string and can
be found.

Link: http://lkml.kernel.org/r/20190506124634.6807-4-peda@axentia.se
Signed-off-by: Peter Rosin <peda@axentia.se>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
lib/test_string.c

index b5117ae5969311ca9128ac3086ac6a12fc048922..7b31f4a505bfb47b448f40289e9402b3bcc547ee 100644 (file)
@@ -112,6 +112,73 @@ fail:
        return 0;
 }
 
+static __init int strchr_selftest(void)
+{
+       const char *test_string = "abcdefghijkl";
+       const char *empty_string = "";
+       char *result;
+       int i;
+
+       for (i = 0; i < strlen(test_string) + 1; i++) {
+               result = strchr(test_string, test_string[i]);
+               if (result - test_string != i)
+                       return i + 'a';
+       }
+
+       result = strchr(empty_string, '\0');
+       if (result != empty_string)
+               return 0x101;
+
+       result = strchr(empty_string, 'a');
+       if (result)
+               return 0x102;
+
+       result = strchr(test_string, 'z');
+       if (result)
+               return 0x103;
+
+       return 0;
+}
+
+static __init int strnchr_selftest(void)
+{
+       const char *test_string = "abcdefghijkl";
+       const char *empty_string = "";
+       char *result;
+       int i, j;
+
+       for (i = 0; i < strlen(test_string) + 1; i++) {
+               for (j = 0; j < strlen(test_string) + 2; j++) {
+                       result = strnchr(test_string, j, test_string[i]);
+                       if (j <= i) {
+                               if (!result)
+                                       continue;
+                               return ((i + 'a') << 8) | j;
+                       }
+                       if (result - test_string != i)
+                               return ((i + 'a') << 8) | j;
+               }
+       }
+
+       result = strnchr(empty_string, 0, '\0');
+       if (result)
+               return 0x10001;
+
+       result = strnchr(empty_string, 1, '\0');
+       if (result != empty_string)
+               return 0x10002;
+
+       result = strnchr(empty_string, 1, 'a');
+       if (result)
+               return 0x10003;
+
+       result = strnchr(NULL, 0, '\0');
+       if (result)
+               return 0x10004;
+
+       return 0;
+}
+
 static __init int string_selftest_init(void)
 {
        int test, subtest;
@@ -131,6 +198,16 @@ static __init int string_selftest_init(void)
        if (subtest)
                goto fail;
 
+       test = 4;
+       subtest = strchr_selftest();
+       if (subtest)
+               goto fail;
+
+       test = 5;
+       subtest = strnchr_selftest();
+       if (subtest)
+               goto fail;
+
        pr_info("String selftests succeeded\n");
        return 0;
 fail: