X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Fplugins%2Funittest%2Fstring_test.c;h=c59a05ced088bcb4b136c1d3db88fc01ef5d9d39;hb=5d5f85f5e4003476fb6d9a0ccd6ad58ad90e5138;hp=65b7c62ece88f2583dd5bc8304f6b4babd2e115a;hpb=027d0dc75690e75c01673f3830c782d6a4eca998;p=vpp.git diff --git a/src/plugins/unittest/string_test.c b/src/plugins/unittest/string_test.c index 65b7c62ece8..c59a05ced08 100644 --- a/src/plugins/unittest/string_test.c +++ b/src/plugins/unittest/string_test.c @@ -85,11 +85,20 @@ test_memcpy_s (vlib_main_t * vm, unformat_input_t * input) if (src[i] != dst[i]) return -1; - /* Size fail */ - err = memcpy_s (dst + 1, sizeof (dst) - 1, src, sizeof (src)); + /* + * Size test: sizeof (src) > sizeof (dst) + * Skip this test when __builtin_constant_p (sizeof (src)) is true. + * This is because memcpy_s_inline skips all the errors checking when the + * the above buildin function returns true which may cause overrun problem + * for dst buffer if this test is executed. + */ + if (__builtin_constant_p (sizeof (src)) == 0) + { + err = memcpy_s (dst + 1, sizeof (dst) - 1, src, sizeof (src)); - if (err == EOK) - return -1; + if (err == EOK) + return -1; + } /* overlap fail */ err = memcpy_s (dst, sizeof (dst), dst + 1, sizeof (dst) - 1); @@ -349,10 +358,6 @@ test_clib_strcmp (vlib_main_t * vm, unformat_input_t * input) /* Null pointers comparison */ s = 0; indicator = clib_strcmp (s, s); - if (indicator != 0) - return -1; - /* verify it against strcmp */ - indicator = strcmp (s, s); if (indicator != 0) return -1; @@ -446,8 +451,6 @@ test_clib_strncmp (vlib_main_t * vm, unformat_input_t * input) v_indicator = strncmp (s1, "Every moment is a fresh beginning", s1len); if (v_indicator != 0) return -1; - if (v_indicator != indicator) - return -1; /* s1 > s2, 0 is expected since comparison is no more than n character */ indicator = clib_strncmp (s1, "Every moment is a fresh begin", @@ -459,8 +462,6 @@ test_clib_strncmp (vlib_main_t * vm, unformat_input_t * input) sizeof ("Every moment is a fresh begin") - 1); if (v_indicator != 0) return -1; - if (v_indicator != indicator) - return -1; /* s1 < s2, < 0 is expected */ indicator = clib_strncmp (s1, "Every moment is fresh beginning", @@ -504,11 +505,10 @@ test_clib_strncmp (vlib_main_t * vm, unformat_input_t * input) v_indicator = strncmp (s1, "Every moment is a fresh beginning", s1len + 1); if (v_indicator != 0) return -1; - if (v_indicator != indicator) - return -1; /* unterminated s1 */ s1[s1len] = 0x1; + CLIB_MEM_UNPOISON (s1, CLIB_STRING_MACRO_MAX); indicator = clib_strncmp (s1, "Every moment is a fresh beginning", sizeof ("every moment is a fresh beginning") - 1); if (indicator != 0) @@ -518,8 +518,6 @@ test_clib_strncmp (vlib_main_t * vm, unformat_input_t * input) sizeof ("Every moment is a fresh beginning") - 1); if (v_indicator != 0) return -1; - if (v_indicator != indicator) - return -1; /* OK, seems to work */ return 0; @@ -575,66 +573,12 @@ test_strcpy_s (vlib_main_t * vm, unformat_input_t * input) return 0; } -static int -test_clib_strcpy (vlib_main_t * vm, unformat_input_t * input) -{ - char src[] = "The journey of a one thousand miles begins with one step."; - char dst[100]; - int indicator; - errno_t err; - - vlib_cli_output (vm, "Test clib_strcpy..."); - - err = clib_strcpy (dst, src); - if (err != EOK) - return -1; - - /* This better not fail but check anyhow */ - if (strcmp_s (dst, clib_strnlen (dst, sizeof (dst)), src, &indicator) != - EOK) - return -1; - if (indicator != 0) - return -1; - - /* verify it against strcpy */ - strcpy (dst, src); - - /* This better not fail but check anyhow */ - if (strcmp_s (dst, clib_strnlen (dst, sizeof (dst)), src, &indicator) != - EOK) - return -1; - if (indicator != 0) - return -1; - - /* Negative tests */ - - err = clib_strcpy (0, 0); - if (err == EOK) - return -1; - - /* overlap fail */ -#if __GNUC__ < 8 - /* GCC 8 flunks this one at compile time... */ - err = clib_strcpy (dst, dst); - if (err == EOK) - return -1; -#endif - - /* overlap fail */ - err = clib_strcpy (dst, dst + 1); - if (err == EOK) - return -1; - - /* OK, seems to work */ - return 0; -} - static int test_strncpy_s (vlib_main_t * vm, unformat_input_t * input) { char src[] = "Those who dare to fail miserably can achieve greatly."; char dst[100], old_dst[100]; - int indicator; + int indicator, i; size_t s1size = sizeof (dst); // including null errno_t err; @@ -664,6 +608,10 @@ test_strncpy_s (vlib_main_t * vm, unformat_input_t * input) return -1; /* n > string len of src */ + err = clib_memset (dst, 1, sizeof (dst)); + if (err != EOK) + return -1; + err = strncpy_s (dst, s1size, src, clib_strnlen (src, sizeof (src)) + 10); if (err != EOK) return -1; @@ -673,6 +621,11 @@ test_strncpy_s (vlib_main_t * vm, unformat_input_t * input) if (indicator != 0) return -1; + /* Make sure bytes after strlen(dst) is untouched */ + for (i = 1 + clib_strnlen (dst, sizeof (dst)); i < sizeof (dst); i++) + if (dst[i] != 1) + return -1; + /* truncation, n >= dmax */ err = strncpy_s (dst, clib_strnlen (src, sizeof (src)), src, clib_strnlen (src, sizeof (src))); @@ -747,6 +700,8 @@ test_clib_strncpy (vlib_main_t * vm, unformat_input_t * input) return -1; /* Verify it against strncpy */ +#if __GNUC__ < 8 + /* GCC 8 debian flunks this one at compile time */ strncpy (dst, src, strlen (src)); /* This better not fail but check anyhow */ @@ -755,6 +710,7 @@ test_clib_strncpy (vlib_main_t * vm, unformat_input_t * input) return -1; if (indicator != 0) return -1; +#endif /* limited copy -- strlen src > n, copy up to n */ err = clib_strncpy (dst, "The price of greatness is responsibility.", 10); @@ -788,12 +744,15 @@ test_clib_strncpy (vlib_main_t * vm, unformat_input_t * input) if (indicator != 0) return -1; /* Verify it against strncpy */ +#if __GNUC__ < 8 + /* GCC 8 debian flunks this one at compile time */ strncpy (dst, src, strlen (src)); if (strcmp_s (dst, clib_strnlen (dst, sizeof (dst)), src, &indicator) != EOK) return -1; if (indicator != 0) return -1; +#endif /* zero length copy */ clib_strncpy (old_dst, dst, clib_strnlen (dst, sizeof (dst))); @@ -890,71 +849,6 @@ test_strcat_s (vlib_main_t * vm, unformat_input_t * input) return 0; } -static int -test_clib_strcat (vlib_main_t * vm, unformat_input_t * input) -{ - char src[100], dst[100], old_dst[100]; - size_t s1size = sizeof (dst); // including null - errno_t err; - int indicator; - - vlib_cli_output (vm, "Test clib_strcat..."); - - strcpy_s (dst, sizeof (dst), "Tough time never last "); - strcpy_s (src, sizeof (src), "but tough people do"); - err = clib_strcat (dst, src); - if (err != EOK) - return -1; - if (strcmp_s (dst, s1size - 1, - "Tough time never last but tough people do", - &indicator) != EOK) - return -1; - if (indicator != 0) - return -1; - /* verify it against strcat */ - strcpy_s (dst, sizeof (dst), "Tough time never last "); - strcpy_s (src, sizeof (src), "but tough people do"); - strcat (dst, src); - if (strcmp_s (dst, s1size - 1, - "Tough time never last but tough people do", - &indicator) != EOK) - return -1; - if (indicator != 0) - return -1; - - /* empty string concatenation */ - clib_strncpy (old_dst, dst, clib_strnlen (dst, sizeof (dst))); - err = clib_strcat (dst, ""); - if (err != EOK) - return -1; - /* verify dst is untouched */ - if (strcmp_s (dst, s1size - 1, old_dst, &indicator) != EOK) - return -1; - if (indicator != 0) - return -1; - - /* negative stuff */ - err = clib_strcat (0, 0); - if (err != EINVAL) - return -1; - - /* overlap fail */ - err = clib_strcat (dst, dst + 1); - if (err != EINVAL) - return -1; - - /* overlap fail */ -#if __GNUC__ < 8 - /* GCC 8 flunks this one at compile time... */ - err = clib_strcat (dst, dst); - if (err != EINVAL) - return -1; -#endif - - /* OK, seems to work */ - return 0; -} - static int test_strncat_s (vlib_main_t * vm, unformat_input_t * input) { @@ -1043,6 +937,8 @@ test_strncat_s (vlib_main_t * vm, unformat_input_t * input) if (indicator != 0) return -1; /* verify it against strncat */ +#if __GNUC__ < 8 + /* GCC 8 debian flunks this one at compile time */ strcpy_s (dst, sizeof (dst), s1); strncat (dst, s2, 13); if (strcmp_s (dst, s1size - 1, "Two things are infinite: the universe ", @@ -1050,6 +946,7 @@ test_strncat_s (vlib_main_t * vm, unformat_input_t * input) return -1; if (indicator != 0) return -1; +#endif /* negative stuff */ err = strncat_s (0, 0, 0, 1); @@ -1079,123 +976,6 @@ test_strncat_s (vlib_main_t * vm, unformat_input_t * input) return 0; } -static int -test_clib_strncat (vlib_main_t * vm, unformat_input_t * input) -{ - char src[100], dst[100], old_dst[100]; - size_t s1size = sizeof (dst); // including null - errno_t err; - char s1[] = "Two things are infinite: "; - char s2[] = "the universe and human stupidity; "; - int indicator; - - vlib_cli_output (vm, "Test clib_strncat..."); - - /* n == strlen src */ - strcpy_s (dst, sizeof (dst), s1); - strcpy_s (src, sizeof (src), s2); - err = clib_strncat (dst, src, clib_strnlen (src, sizeof (src))); - if (err != EOK) - return -1; - if (strcmp_s (dst, s1size - 1, - "Two things are infinite: the universe and human stupidity; ", - &indicator) != EOK) - return -1; - if (indicator != 0) - return -1; - /* verify it against strncat */ - strcpy_s (dst, sizeof (dst), s1); - strncat (dst, src, clib_strnlen (src, sizeof (src))); - if (strcmp_s (dst, s1size - 1, - "Two things are infinite: the universe and human stupidity; ", - &indicator) != EOK) - return -1; - if (indicator != 0) - return -1; - - /* n > strlen src */ - strcpy_s (dst, sizeof (dst), s1); - err = clib_strncat (dst, src, clib_strnlen (src, sizeof (src)) + 10); - if (err != EOK) - return -1; - if (strcmp_s (dst, s1size - 1, - "Two things are infinite: the universe and human stupidity; ", - &indicator) != EOK) - return -1; - if (indicator != 0) - return -1; - /* verify it against strncat */ - strcpy_s (dst, sizeof (dst), s1); - strncat (dst, src, clib_strnlen (src, sizeof (src))); - if (strcmp_s (dst, s1size - 1, - "Two things are infinite: the universe and human stupidity; ", - &indicator) != EOK) - return -1; - if (indicator != 0) - return -1; - - /* zero length strncat */ - clib_strncpy (old_dst, dst, clib_strnlen (dst, sizeof (dst))); - err = clib_strncat (dst, src, 0); - if (err != EOK) - return -1; - /* verify dst is untouched */ - if (strcmp_s (dst, s1size - 1, old_dst, &indicator) != EOK) - return -1; - if (indicator != 0) - return -1; - - /* empty string, wrong n concatenation */ - err = clib_strncat (dst, "", 10); - if (err != EOK) - return -1; - /* verify dst is untouched */ - if (strcmp_s (dst, s1size - 1, old_dst, &indicator) != EOK) - return -1; - if (indicator != 0) - return -1; - - /* limited concatenation, string > n, copy up to n */ - strcpy_s (dst, sizeof (dst), s1); - err = clib_strncat (dst, s2, 13); - if (err != EOK) - return -1; - if (strcmp_s (dst, s1size - 1, "Two things are infinite: the universe ", - &indicator) != EOK) - return -1; - if (indicator != 0) - return -1; - /* verify it against strncat */ - strcpy_s (dst, sizeof (dst), s1); - strncat (dst, s2, 13); - if (strcmp_s (dst, s1size - 1, "Two things are infinite: the universe ", - &indicator) != EOK) - return -1; - if (indicator != 0) - return -1; - - /* negative stuff */ - err = clib_strncat (0, 0, 1); - if (err != EINVAL) - return -1; - - /* overlap fail */ - err = clib_strncat (dst, dst + 1, s1size - 1); - if (err != EINVAL) - return -1; - - /* overlap fail */ -#if __GNUC__ < 8 - /* GCC 8 flunks this one at compile time... */ - err = clib_strncat (dst, dst, clib_strnlen (dst, sizeof (dst))); - if (err != EINVAL) - return -1; -#endif - - /* OK, seems to work */ - return 0; -} - static int test_strtok_s (vlib_main_t * vm, unformat_input_t * input) { @@ -1521,102 +1301,35 @@ test_strstr_s (vlib_main_t * vm, unformat_input_t * input) return 0; } -static int -test_clib_strstr (vlib_main_t * vm, unformat_input_t * input) -{ - char *sub, *s; - char s1[64]; - size_t s1len = sizeof (s1) - 1; // excluding null - int indicator; - - vlib_cli_output (vm, "Test clib_strstr..."); - - /* substring not present */ - strcpy_s (s1, s1len, "success is not final, failure is not fatal."); - sub = clib_strstr (s1, "failures"); - if (sub != 0) - return -1; - /* verify it against strstr */ - sub = strstr (s1, "failures"); - if (sub != 0) - return -1; - - /* substring present */ - sub = clib_strstr (s1, "failure"); - if (sub == 0) - return -1; - if (strcmp_s (sub, strlen (sub), "failure is not fatal.", &indicator) != - EOK) - return -1; - if (indicator != 0) - return -1; - /* verify it against strstr */ - sub = strstr (s1, "failure"); - if (sub == 0) - return -1; - if (strcmp_s (sub, strlen (sub), "failure is not fatal.", &indicator) != - EOK) - return -1; - if (indicator != 0) - return -1; - - /* negative stuff */ - - /* Null pointers test */ - s = 0; - sub = clib_strstr (s, s); - if (sub != 0) - return -1; - /* - * Can't verify it against strstr for this test. Null pointers cause strstr - * to crash. Go figure! - */ - - /* unterminated s1 and s2 */ - memset_s (s1, ARRAY_LEN (s1), 0xfe, ARRAY_LEN (s1)); - sub = clib_strstr (s1, s1); - if (sub == 0) - return -1; - /* - * Can't verify it against strstr for this test. Unterminated string causes - * strstr to crash. Go figure! - */ - - /* OK, seems to work */ - return 0; -} - -#define foreach_string_test \ - _ (0, MEMCPY_S, "memcpy_s", memcpy_s) \ - _ (1, CLIB_MEMCPY, "clib_memcpy", clib_memcpy) \ - _ (2, MEMSET_S , "memset_s", memset_s) \ - _ (3, CLIB_MEMSET , "clib_memset", clib_memset) \ - _ (4, MEMCMP_S, "memcmp_s", memcmp_s) \ - _ (5, CLIB_MEMCMP, "clib_memcmp", clib_memcmp) \ - _ (6, STRCMP_S, "strcmp_s", strcmp_s) \ - _ (7, CLIB_STRCMP, "clib_strcmp", clib_strcmp) \ - _ (8, STRNCMP_S, "strncmp_s", strncmp_s) \ - _ (9, CLIB_STRNCMP, "clib_strncmp", clib_strncmp) \ - _ (10, STRCPY_S, "strcpy_s", strcpy_s) \ - _ (11, CLIB_STRCPY, "clib_strcpy", clib_strcpy) \ - _ (12, STRNCPY_S, "strncpy_s", strncpy_s) \ - _ (13, CLIB_STRNCPY, "clib_strncpy", clib_strncpy) \ - _ (14, STRCAT_S, "strcat_s", strcat_s) \ - _ (15, CLIB_STRCAT, "clib_strcat", clib_strcat) \ - _ (16, STRNCAT_S, "strncat_s", strncat_s) \ - _ (17, CLIB_STRNCAT, "clib_strncat", clib_strncat) \ - _ (18, STRTOK_S, "strtok_s", strtok_s) \ - _ (19, CLIB_STRTOK, "clib_strtok", clib_strtok) \ - _ (20, STRNLEN_S, "strnlen_s", strnlen_s) \ - _ (21, CLIB_STRNLEN, "clib_strnlen", clib_strnlen) \ - _ (22, STRSTR_S, "strstr_s", strstr_s) \ - _ (23, CLIB_STRSTR, "clib_strstr", clib_strstr) +#define foreach_string_test \ + _ (0, MEMCPY_S, "memcpy_s", memcpy_s) \ + _ (1, CLIB_MEMCPY, "clib_memcpy", clib_memcpy) \ + _ (2, MEMSET_S, "memset_s", memset_s) \ + _ (3, CLIB_MEMSET, "clib_memset", clib_memset) \ + _ (4, MEMCMP_S, "memcmp_s", memcmp_s) \ + _ (5, CLIB_MEMCMP, "clib_memcmp", clib_memcmp) \ + _ (6, STRCMP_S, "strcmp_s", strcmp_s) \ + _ (7, CLIB_STRCMP, "clib_strcmp", clib_strcmp) \ + _ (8, STRNCMP_S, "strncmp_s", strncmp_s) \ + _ (9, CLIB_STRNCMP, "clib_strncmp", clib_strncmp) \ + _ (10, STRCPY_S, "strcpy_s", strcpy_s) \ + _ (11, STRNCPY_S, "strncpy_s", strncpy_s) \ + _ (12, CLIB_STRNCPY, "clib_strncpy", clib_strncpy) \ + _ (13, STRCAT_S, "strcat_s", strcat_s) \ + _ (14, STRNCAT_S, "strncat_s", strncat_s) \ + _ (15, STRTOK_S, "strtok_s", strtok_s) \ + _ (16, CLIB_STRTOK, "clib_strtok", clib_strtok) \ + _ (17, STRNLEN_S, "strnlen_s", strnlen_s) \ + _ (18, CLIB_STRNLEN, "clib_strnlen", clib_strnlen) \ + _ (19, STRSTR_S, "strstr_s", strstr_s) typedef enum { #define _(v,f,s,p) STRING_TEST_##f = v, foreach_string_test #undef _ +#define STRING_TEST_FIRST STRING_TEST_MEMCPY_S +#define STRING_TEST_LAST STRING_TEST_STRSTR_S } string_test_t; static uword @@ -1671,8 +1384,8 @@ string_test_command_fn (vlib_main_t * vm, if (specific_test == ~0) { - for (specific_test = STRING_TEST_MEMCPY_S; - specific_test <= STRING_TEST_CLIB_STRSTR; specific_test++) + for (specific_test = STRING_TEST_FIRST; + specific_test <= STRING_TEST_LAST; specific_test++) { ok = (string_func[specific_test]).test (vm, input); res += ok; @@ -1691,15 +1404,14 @@ string_test_command_fn (vlib_main_t * vm, } /* *INDENT-OFF* */ -VLIB_CLI_COMMAND (string_test_command, static) = -{ +VLIB_CLI_COMMAND (string_test_command, static) = { .path = "test string", - .short_help = "test string [memcpy_s | clib_memcpy | memset_s | " - "clib_memset | memcmp_s | clib_memcmp | strcmp_s | clib_strcmp | " - "strncmp_s | clib_strncmp | strcpy_s | clib_strcpy | strncpy_s | " - "clib_strncpy | strcat_s | clib_strcat | strncat_s | clib_strncat | " - "strtok_s | clib_strtok | strnlen_s | clib_strnlen | strstr_s | " - "clib_strstr]", + .short_help = + "test string [memcpy_s | clib_memcpy | memset_s | " + "clib_memset | memcmp_s | clib_memcmp | strcmp_s | clib_strcmp | " + "strncmp_s | clib_strncmp | strcpy_s | strncpy_s | " + "clib_strncpy | strcat_s | strncat_s | " + "strtok_s | clib_strtok | strnlen_s | clib_strnlen | strstr_s ]", .function = string_test_command_fn, }; /* *INDENT-ON* */