diff --git a/memcheck/tests/Makefile.am b/memcheck/tests/Makefile.am index 6b803bef6..8edb5d7c3 100644 --- a/memcheck/tests/Makefile.am +++ b/memcheck/tests/Makefile.am @@ -2,7 +2,7 @@ SUBDIRS = ${VG_ARCH} . DIST_SUBDIRS = ${VG_ARCH_ALL} . noinst_SCRIPTS = filter_allocs filter_leak_check_size \ - filter_stderr filter_stderr_backtrace + filter_stderr filter_stderr_backtrace filter_xml EXTRA_DIST = $(noinst_SCRIPTS) \ addressable.stderr.exp addressable.stdout.exp addressable.vgtest \ @@ -77,6 +77,7 @@ EXTRA_DIST = $(noinst_SCRIPTS) \ metadata.stderr.exp metadata.stdout.exp metadata.vgtest \ vgtest_ume.stderr.exp vgtest_ume.vgtest \ writev.stderr.exp writev.stderr.exp2 writev.stderr.exp3 writev.vgtest \ + xml1.stderr.exp xml1.stdout.exp xml1.vgtest \ zeropage.stderr.exp zeropage.stderr.exp2 zeropage.vgtest check_PROGRAMS = \ @@ -100,7 +101,7 @@ check_PROGRAMS = \ str_tester supp1 supp2 suppfree \ trivialleak weirdioctl \ mismatches new_override metadata \ - vgtest_ume \ + vgtest_ume xml1 \ writev zeropage @@ -173,6 +174,7 @@ metadata_SOURCES = metadata.c str_tester_SOURCES = str_tester.c str_tester_CFLAGS = $(AM_CFLAGS) -Wno-shadow writev_SOURCES = writev.c +xml1_SOURCES = xml1.c zeropage_SOURCES = zeropage.c # C++ ones diff --git a/memcheck/tests/filter_xml b/memcheck/tests/filter_xml new file mode 100755 index 000000000..f795d5eca --- /dev/null +++ b/memcheck/tests/filter_xml @@ -0,0 +1,9 @@ +#! /bin/sh + +./filter_stderr | +sed "s/[0-9]*<\/tid>/...<\/tid>/" | +sed "s/[0-9]*<\/pid>/...<\/pid>/" | +sed "s/[0-9]*<\/ppid>/...<\/ppid>/" | +sed "s/.*<\/obj>/...<\/obj>/" | +sed "s/.*<\/preamble>/...<\/preamble>/" + diff --git a/memcheck/tests/xml1.c b/memcheck/tests/xml1.c new file mode 100644 index 000000000..abf2d3887 --- /dev/null +++ b/memcheck/tests/xml1.c @@ -0,0 +1,50 @@ + +#include +#include + + +int frame3 ( void ) +{ + int *a = malloc(10 * sizeof(int)); + + // bad address; + int n = a[10]; + + // undefined condition + if (a[5] == 42) { + printf("hello from frame3(). The answer is 42.\n"); + } else { + printf("hello from frame3(). The answer is not 42.\n"); + } + + // undefined address (careful ..) + n = a[ a[0] & 7 ]; + + // invalid free, the second time + free(a); + free(a); + + // more invalid frees + free(&n); + + // leak .. + a = malloc(99 * sizeof(int)); + + // pass garbage to the exit syscall + return n; +} + +int frame2 ( void ) +{ + return frame3() - 1; +} + +int frame1 ( void ) +{ + return frame2() + 1; +} + +int main ( void ) +{ + return frame1() - 1; +} diff --git a/memcheck/tests/xml1.stderr.exp b/memcheck/tests/xml1.stderr.exp new file mode 100644 index 000000000..9cdc414a9 --- /dev/null +++ b/memcheck/tests/xml1.stderr.exp @@ -0,0 +1,151 @@ + + + +1 + +... +... +... +... +... +... + +... +... +memcheck + + + ./xml1 + + +RUNNING + + + 0x........ + ... + InvalidRead + Invalid read of size 4 + + 0x...........frame3 + 0x...........frame2 + 0x...........frame1 + 0x...........main + + Address 0x........ is 0 bytes after a block of size 40 alloc'd + + 0x...........mallocvg_replace_malloc.c220 + 0x...........frame3 + 0x...........frame2 + 0x...........frame1 + 0x...........main + + + + + 0x........ + ... + UninitCondition + Conditional jump or move depends on uninitialised value(s) + + 0x...........frame3 + 0x...........frame2 + 0x...........frame1 + 0x...........main + + + + + 0x........ + ... + UninitValue + Use of uninitialised value of size 4 + + 0x...........frame3 + 0x...........frame2 + 0x...........frame1 + 0x...........main + + + + + 0x........ + ... + InvalidFree + Invalid free() / delete / delete[] + + 0x...........freevg_replace_malloc.c306 + 0x...........frame3 + 0x...........frame2 + 0x...........frame1 + 0x...........main + + Address 0x........ is 0 bytes inside a block of size 40 free'd + + 0x...........freevg_replace_malloc.c306 + 0x...........frame3 + 0x...........frame2 + 0x...........frame1 + 0x...........main + + + + + 0x........ + ... + InvalidFree + Invalid free() / delete / delete[] + + 0x...........freevg_replace_malloc.c306 + 0x...........frame3 + 0x...........frame2 + 0x...........frame1 + 0x...........main + + Address 0x........ is on thread 1's stack + + + + 0x........ + ... + SyscallParam + Syscall param exit_group(exit_code) contains uninitialised byte(s) + + 0x..........._Exit + 0x...........__libc_start_main + 0x...........start.S102 + + + + + 10x........ + 10x........ + 10x........ + 10x........ + 10x........ + 10x........ + + +FINISHED + + + 18Ugly strchr error in /lib/ld-2.3.3.so + + + + 0x........ + ... + Leak_DefinitelyLost + 396 bytes in 1 blocks are definitely lost in loss record 1 of 1 + 396 + 1 + + 0x...........mallocvg_replace_malloc.c220 + 0x...........frame3 + 0x...........frame2 + 0x...........frame1 + 0x...........main + + + + + diff --git a/memcheck/tests/xml1.stdout.exp b/memcheck/tests/xml1.stdout.exp new file mode 100644 index 000000000..9397eece6 --- /dev/null +++ b/memcheck/tests/xml1.stdout.exp @@ -0,0 +1 @@ +hello from frame3(). The answer is not 42. diff --git a/memcheck/tests/xml1.vgtest b/memcheck/tests/xml1.vgtest new file mode 100644 index 000000000..5a6769b2d --- /dev/null +++ b/memcheck/tests/xml1.vgtest @@ -0,0 +1,3 @@ +prog: xml1 +vgopts: --xml=yes +stderr_filter: filter_xml