diff options
Diffstat (limited to 'gcc-4.9/gcc/testsuite/gcc.dg/asan/nosanitize-and-inline.c')
-rw-r--r-- | gcc-4.9/gcc/testsuite/gcc.dg/asan/nosanitize-and-inline.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/gcc.dg/asan/nosanitize-and-inline.c b/gcc-4.9/gcc/testsuite/gcc.dg/asan/nosanitize-and-inline.c new file mode 100644 index 000000000..585380162 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/gcc.dg/asan/nosanitize-and-inline.c @@ -0,0 +1,57 @@ +/* { dg-do run } */ + +/* This is a simplified version of what Emacs does internally, + when marking its stack. */ + +static unsigned long sum; +static void *stack_base; + +/* A simple substitute for what Emacs actually does. */ +static void +mark_maybe_pointer (void *p) +{ + sum ^= (unsigned long) p; +} + +static inline void __attribute__ ((no_sanitize_address)) +mark_memory (void **start, void **end) +{ + void **pp; + + if (end < start) + { + void **tem = start; + start = end; + end = tem; + } + + for (pp = start; pp < end; pp++) + { + /* This is the dereference that we don't want sanitized. */ + void *p = *pp; + + mark_maybe_pointer (p); + } +} + +static void +mark_stack (void) +{ + void *end; + mark_memory (stack_base, &end); +} + +void +garbage_collect (void) +{ + mark_stack (); +} + +int +main (void) +{ + void *dummy; + stack_base = &dummy; + garbage_collect (); + return 0; +} |