]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Add memmem memcheck tests
authorMark Wielaard <mark@klomp.org>
Thu, 19 May 2022 22:08:40 +0000 (18:08 -0400)
committerAndreas Arnez <arnez@linux.ibm.com>
Thu, 7 Jul 2022 12:24:39 +0000 (14:24 +0200)
Ensure that memmem behaves as expected and doesn't yield memcheck false
positives.

memcheck/tests/Makefile.am
memcheck/tests/memmem.c [new file with mode: 0644]
memcheck/tests/memmem.stderr.exp [new file with mode: 0644]
memcheck/tests/memmem.vgtest [new file with mode: 0644]

index c8fa5b5cbf129bea72f5f1ef8b0ebd44003b50c3..24cfa020cd4216c0d0e2f32c8c2b68fe1dea90d8 100644 (file)
@@ -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 (file)
index 0000000..7cefafc
--- /dev/null
@@ -0,0 +1,69 @@
+#define _GNU_SOURCE
+#include <assert.h>
+#include <string.h>
+#include <stdlib.h>
+
+/* 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 (file)
index 0000000..e69de29
diff --git a/memcheck/tests/memmem.vgtest b/memcheck/tests/memmem.vgtest
new file mode 100644 (file)
index 0000000..4feafd6
--- /dev/null
@@ -0,0 +1,2 @@
+prog: memmem
+vgopts: -q