From: Mark Wielaard Date: Thu, 19 May 2022 22:08:40 +0000 (-0400) Subject: Add memmem memcheck tests X-Git-Tag: VALGRIND_3_20_0~20 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=74e180e3c4d9e6bb4b2a9cd22eca7703412c5d42;p=thirdparty%2Fvalgrind.git Add memmem memcheck tests Ensure that memmem behaves as expected and doesn't yield memcheck false positives. --- diff --git a/memcheck/tests/Makefile.am b/memcheck/tests/Makefile.am index c8fa5b5cbf..24cfa020cd 100644 --- a/memcheck/tests/Makefile.am +++ b/memcheck/tests/Makefile.am @@ -219,6 +219,7 @@ EXTRA_DIST = \ memalign2.stderr.exp memalign2.vgtest \ memcmptest.stderr.exp memcmptest.stderr.exp2 \ memcmptest.stdout.exp memcmptest.vgtest \ + memmem.stderr.exp memmem.vgtest \ mempool.stderr.exp mempool.vgtest \ mempool2.stderr.exp mempool2.vgtest \ metadata.stderr.exp metadata.stdout.exp metadata.vgtest \ @@ -417,6 +418,7 @@ check_PROGRAMS = \ malloc_usable malloc1 malloc2 malloc3 manuel1 manuel2 manuel3 \ match-overrun \ memalign_test memalign2 memcmptest mempool mempool2 mmaptest \ + memmem \ mismatches new_override metadata \ nanoleak_supp nanoleak2 new_nothrow \ noisy_child \ diff --git a/memcheck/tests/memmem.c b/memcheck/tests/memmem.c new file mode 100644 index 0000000000..7cefafcc65 --- /dev/null +++ b/memcheck/tests/memmem.c @@ -0,0 +1,69 @@ +#define _GNU_SOURCE +#include +#include +#include + +/* mallocs an mem block and fills it with A. A needs to be a zero + terminated string. The A string chars, minus the terminating zero + are copied into the returned mem block. */ +static void * +create_mem (const char *a) +{ + size_t len = strlen (a); + void *mem = malloc (len); + memcpy (mem, a, len); + return mem; +} + +int +main () +{ + char *haystack; + char *needle; + + haystack = create_mem ("a"); + needle = create_mem ("a"); + assert (memmem (haystack, 0, needle, 0) == haystack); + assert (memmem (haystack, 1, needle, 0) == haystack); + assert (memmem (haystack, 0, needle, 1) == NULL); + assert (memmem (haystack, 1, needle, 1) == haystack); + free (haystack); + free (needle); + + haystack = create_mem ("abc"); + needle = create_mem ("bc"); + assert (memmem (haystack, 3, needle, 0) == haystack); + assert (memmem (haystack, 3, needle, 2) == haystack + 1); + assert (memmem (haystack + 1, 2, needle, 2) == haystack + 1); + assert (memmem (haystack + 2, 1, needle, 2) == NULL); + free (haystack); + free (needle); + + haystack = create_mem ("abcabcabc"); + needle = create_mem ("bca"); + assert (memmem (haystack, 9, needle, 3) == haystack + 1); + free (haystack); + free (needle); + + haystack = create_mem ("abcabcabc"); + needle = create_mem ("bcad"); + assert (memmem (haystack, 9, needle, 4) == NULL); + free (haystack); + free (needle); + + haystack = create_mem ("xxxxxxxxxxxxxxxxxABC"); + needle = create_mem ("ABCD"); + assert (memmem (haystack, 20, needle, 2) == haystack + 17); + assert (memmem (haystack + 3, 17, needle, 2) == haystack + 17); + assert (memmem (haystack + 15, 5, needle, 2) == haystack + 17); + assert (memmem (haystack, 20, needle, 3) == haystack + 17); + assert (memmem (haystack + 3, 17, needle, 3) == haystack + 17); + assert (memmem (haystack + 15, 5, needle, 3) == haystack + 17); + assert (memmem (haystack, 20, needle, 4) == NULL); + assert (memmem (haystack + 3, 5, needle, 4) == NULL); + assert (memmem (haystack + 15, 5, needle, 4) == NULL); + free (haystack); + free (needle); + + return 0; +} diff --git a/memcheck/tests/memmem.stderr.exp b/memcheck/tests/memmem.stderr.exp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/memcheck/tests/memmem.vgtest b/memcheck/tests/memmem.vgtest new file mode 100644 index 0000000000..4feafd6328 --- /dev/null +++ b/memcheck/tests/memmem.vgtest @@ -0,0 +1,2 @@ +prog: memmem +vgopts: -q