Re: [PATCH] selftests/nolibc: add 7 tests for memcmp()

From: Paul E. McKenney
Date: Fri Oct 21 2022 - 11:57:11 EST


On Fri, Oct 21, 2022 at 08:03:40AM +0200, Willy Tarreau wrote:
> This adds 7 combinations of input values for memcmp() using signed and
> unsigned bytes, which will trigger on the original code before Rasmus'
> fix. This is mostly aimed at helping backporters verify their work, and
> showing how tests for corner cases can be added to the selftests suite.
>
> Before the fix it reports:
> 12 memcmp_20_20 = 0 [OK]
> 13 memcmp_20_60 = -64 [OK]
> 14 memcmp_60_20 = 64 [OK]
> 15 memcmp_20_e0 = 64 [FAIL]
> 16 memcmp_e0_20 = -64 [FAIL]
> 17 memcmp_80_e0 = -96 [OK]
> 18 memcmp_e0_80 = 96 [OK]
>
> And after:
> 12 memcmp_20_20 = 0 [OK]
> 13 memcmp_20_60 = -64 [OK]
> 14 memcmp_60_20 = 64 [OK]
> 15 memcmp_20_e0 = -192 [OK]
> 16 memcmp_e0_20 = 192 [OK]
> 17 memcmp_80_e0 = -96 [OK]
> 18 memcmp_e0_80 = 96 [OK]
>
> Cc: Rasmus Villemoes <linux@xxxxxxxxxxxxxxxxxx>
> Signed-off-by: Willy Tarreau <w@xxxxxx>

I have pulled both of these in, thank you!

One thing, though... I had to do "make clean" in both tools/include/nolibc
and tools/testing/selftests/nolibc to make those two "[FAIL]" indications
go away. Does this mean that I am doing something wrong?

It would be good to know before I send the pull request containing these,
so that we can let Linus know of anything special he needs to do to
ensure a valid test result.

Thanx, Paul

> ---
> tools/testing/selftests/nolibc/nolibc-test.c | 7 +++++++
> 1 file changed, 7 insertions(+)
>
> diff --git a/tools/testing/selftests/nolibc/nolibc-test.c b/tools/testing/selftests/nolibc/nolibc-test.c
> index 78bced95ac63..f14f5076fb6d 100644
> --- a/tools/testing/selftests/nolibc/nolibc-test.c
> +++ b/tools/testing/selftests/nolibc/nolibc-test.c
> @@ -565,6 +565,13 @@ int run_stdlib(int min, int max)
> CASE_TEST(strchr_foobar_z); EXPECT_STRZR(1, strchr("foobar", 'z')); break;
> CASE_TEST(strrchr_foobar_o); EXPECT_STREQ(1, strrchr("foobar", 'o'), "obar"); break;
> CASE_TEST(strrchr_foobar_z); EXPECT_STRZR(1, strrchr("foobar", 'z')); break;
> + CASE_TEST(memcmp_20_20); EXPECT_EQ(1, memcmp("aaa\x20", "aaa\x20", 4), 0); break;
> + CASE_TEST(memcmp_20_60); EXPECT_LT(1, memcmp("aaa\x20", "aaa\x60", 4), 0); break;
> + CASE_TEST(memcmp_60_20); EXPECT_GT(1, memcmp("aaa\x60", "aaa\x20", 4), 0); break;
> + CASE_TEST(memcmp_20_e0); EXPECT_LT(1, memcmp("aaa\x20", "aaa\xe0", 4), 0); break;
> + CASE_TEST(memcmp_e0_20); EXPECT_GT(1, memcmp("aaa\xe0", "aaa\x20", 4), 0); break;
> + CASE_TEST(memcmp_80_e0); EXPECT_LT(1, memcmp("aaa\x80", "aaa\xe0", 4), 0); break;
> + CASE_TEST(memcmp_e0_80); EXPECT_GT(1, memcmp("aaa\xe0", "aaa\x80", 4), 0); break;
> case __LINE__:
> return ret; /* must be last */
> /* note: do not set any defaults so as to permit holes above */
> --
> 2.17.5
>