From 7e42fd6653a534d47ffed5ec68d1a3962c1986cf Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Thu, 13 Aug 2009 09:30:57 +0000 Subject: [PATCH] Added test program for the ANNOTATE_IGNORE_WRITES_*() annotation macro's. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@10800 --- drd/tests/Makefile.am | 5 ++ drd/tests/annotate_ignore_write.c | 63 +++++++++++++++++++++ drd/tests/annotate_ignore_write.stderr.exp | 19 +++++++ drd/tests/annotate_ignore_write.vgtest | 4 ++ drd/tests/annotate_ignore_write2.stderr.exp | 24 ++++++++ drd/tests/annotate_ignore_write2.vgtest | 5 ++ 6 files changed, 120 insertions(+) create mode 100644 drd/tests/annotate_ignore_write.c create mode 100644 drd/tests/annotate_ignore_write.stderr.exp create mode 100644 drd/tests/annotate_ignore_write.vgtest create mode 100644 drd/tests/annotate_ignore_write2.stderr.exp create mode 100644 drd/tests/annotate_ignore_write2.vgtest diff --git a/drd/tests/Makefile.am b/drd/tests/Makefile.am index 1abd7a8f30..54ff4d694c 100644 --- a/drd/tests/Makefile.am +++ b/drd/tests/Makefile.am @@ -29,6 +29,10 @@ EXTRA_DIST = \ annotate_ignore_rw.vgtest \ annotate_ignore_rw2.stderr.exp \ annotate_ignore_rw2.vgtest \ + annotate_ignore_write.stderr.exp \ + annotate_ignore_write.vgtest \ + annotate_ignore_write2.stderr.exp \ + annotate_ignore_write2.vgtest \ annotate_trace_memory.stderr.exp \ annotate_trace_memory.vgtest \ atomic_var.stderr.exp \ @@ -244,6 +248,7 @@ EXTRA_DIST = \ check_PROGRAMS = \ annotate_ignore_rw \ + annotate_ignore_write \ custom_alloc \ fp_race \ hold_lock \ diff --git a/drd/tests/annotate_ignore_write.c b/drd/tests/annotate_ignore_write.c new file mode 100644 index 0000000000..16efe03312 --- /dev/null +++ b/drd/tests/annotate_ignore_write.c @@ -0,0 +1,63 @@ +/* Test program for the annotations that suppress write operations. */ + +#include /* assert() */ +#include +#include /* EOF */ +#include /* getopt() */ +#include "../../drd/drd.h" + +static int s_a; +static int s_b; +static int s_c; + +static void* thread_func(void* arg) +{ + /* Read s_a and modify s_b. */ + s_b = s_a; + /* Modify s_c. */ + s_c = 1; + + return NULL; +} + +int main(int argc, char** argv) +{ + int optchar; + int ign_rw = 1; + pthread_t tid; + + while ((optchar = getopt(argc, argv, "r")) != EOF) + { + switch (optchar) + { + case 'r': + ign_rw = 0; + break; + default: + assert(0); + } + } + + pthread_create(&tid, 0, thread_func, 0); + if (ign_rw) + ANNOTATE_IGNORE_WRITES_BEGIN(); + /* Read s_b and modify s_a. */ + s_a = s_b; + if (ign_rw) + ANNOTATE_IGNORE_WRITES_END(); + + /* + * Insert a delay here in order to make sure the load of s_c happens + * after s_c has been modified. + */ + sleep(1); + + /* Read s_c and modify s_a. */ + s_a = s_c; + + pthread_join(tid, 0); + + fprintf(stderr, "Finished.\n"); + + return 0; +} diff --git a/drd/tests/annotate_ignore_write.stderr.exp b/drd/tests/annotate_ignore_write.stderr.exp new file mode 100644 index 0000000000..63ade6c052 --- /dev/null +++ b/drd/tests/annotate_ignore_write.stderr.exp @@ -0,0 +1,19 @@ + +Conflicting load by thread 1 at 0x........ size 4 + at 0x........: main (annotate_ignore_write.c:?) +Location 0x........ is 0 bytes inside local var "s_b" +declared at annotate_ignore_write.c:10, in frame #? of thread 1 + +Conflicting load by thread 1 at 0x........ size 4 + at 0x........: main (annotate_ignore_write.c:?) +Location 0x........ is 0 bytes inside local var "s_c" +declared at annotate_ignore_write.c:11, in frame #? of thread 1 + +Conflicting store by thread 1 at 0x........ size 4 + at 0x........: main (annotate_ignore_write.c:?) +Location 0x........ is 0 bytes inside local var "s_a" +declared at annotate_ignore_write.c:9, in frame #? of thread 1 + +Finished. + +ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 0 from 0) diff --git a/drd/tests/annotate_ignore_write.vgtest b/drd/tests/annotate_ignore_write.vgtest new file mode 100644 index 0000000000..1cc3ef0521 --- /dev/null +++ b/drd/tests/annotate_ignore_write.vgtest @@ -0,0 +1,4 @@ +prereq: ./supported_libpthread +vgopts: --read-var-info=yes --check-stack-var=yes --show-confl-seg=no +prog: annotate_ignore_write +stderr_filter: filter_stderr diff --git a/drd/tests/annotate_ignore_write2.stderr.exp b/drd/tests/annotate_ignore_write2.stderr.exp new file mode 100644 index 0000000000..e0eef71875 --- /dev/null +++ b/drd/tests/annotate_ignore_write2.stderr.exp @@ -0,0 +1,24 @@ + +Conflicting load by thread 1 at 0x........ size 4 + at 0x........: main (annotate_ignore_write.c:?) +Location 0x........ is 0 bytes inside local var "s_b" +declared at annotate_ignore_write.c:10, in frame #? of thread 1 + +Conflicting store by thread 1 at 0x........ size 4 + at 0x........: main (annotate_ignore_write.c:?) +Location 0x........ is 0 bytes inside local var "s_a" +declared at annotate_ignore_write.c:9, in frame #? of thread 1 + +Conflicting load by thread 1 at 0x........ size 4 + at 0x........: main (annotate_ignore_write.c:?) +Location 0x........ is 0 bytes inside local var "s_c" +declared at annotate_ignore_write.c:11, in frame #? of thread 1 + +Conflicting store by thread 1 at 0x........ size 4 + at 0x........: main (annotate_ignore_write.c:?) +Location 0x........ is 0 bytes inside local var "s_a" +declared at annotate_ignore_write.c:9, in frame #? of thread 1 + +Finished. + +ERROR SUMMARY: 4 errors from 4 contexts (suppressed: 0 from 0) diff --git a/drd/tests/annotate_ignore_write2.vgtest b/drd/tests/annotate_ignore_write2.vgtest new file mode 100644 index 0000000000..b16ced7e81 --- /dev/null +++ b/drd/tests/annotate_ignore_write2.vgtest @@ -0,0 +1,5 @@ +prereq: ./supported_libpthread +vgopts: --read-var-info=yes --check-stack-var=yes --show-confl-seg=no +prog: annotate_ignore_write +args: -r +stderr_filter: filter_stderr -- 2.47.3