From 74e180e3c4d9e6bb4b2a9cd22eca7703412c5d42 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 19 May 2022 18:08:40 -0400 Subject: [PATCH] Add memmem memcheck tests Ensure that memmem behaves as expected and doesn't yield memcheck false positives. --- memcheck/tests/Makefile.am | 2 + memcheck/tests/memmem.c | 69 ++++++++++++++++++++++++++++++++ memcheck/tests/memmem.stderr.exp | 0 memcheck/tests/memmem.vgtest | 2 + 4 files changed, 73 insertions(+) create mode 100644 memcheck/tests/memmem.c create mode 100644 memcheck/tests/memmem.stderr.exp create mode 100644 memcheck/tests/memmem.vgtest diff --git a/memcheck/tests/Makefile.am b/memcheck/tests/Makefile.am index c8fa5b5cb..24cfa020c 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 000000000..7cefafcc6 --- /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 000000000..e69de29bb diff --git a/memcheck/tests/memmem.vgtest b/memcheck/tests/memmem.vgtest new file mode 100644 index 000000000..4feafd632 --- /dev/null +++ b/memcheck/tests/memmem.vgtest @@ -0,0 +1,2 @@ +prog: memmem +vgopts: -q