annotate gcc/testsuite/c-c++-common/asan/use-after-return-1.c @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 84e7813d76e9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* { dg-do run } */
kono
parents:
diff changeset
2 /* { dg-set-target-env-var ASAN_OPTIONS "detect_stack_use_after_return=1" } */
kono
parents:
diff changeset
3 /* { dg-shouldfail "asan" } */
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 #include <stdio.h>
kono
parents:
diff changeset
6 #include <pthread.h>
kono
parents:
diff changeset
7
kono
parents:
diff changeset
8 #ifndef kSize
kono
parents:
diff changeset
9 # define kSize 1
kono
parents:
diff changeset
10 #endif
kono
parents:
diff changeset
11
kono
parents:
diff changeset
12 #ifndef UseThread
kono
parents:
diff changeset
13 # define UseThread 0
kono
parents:
diff changeset
14 #endif
kono
parents:
diff changeset
15
kono
parents:
diff changeset
16 __attribute__((noinline))
kono
parents:
diff changeset
17 char *Ident(char *x) {
kono
parents:
diff changeset
18 fprintf(stderr, "1: %p\n", x);
kono
parents:
diff changeset
19 return x;
kono
parents:
diff changeset
20 }
kono
parents:
diff changeset
21
kono
parents:
diff changeset
22 __attribute__((noinline))
kono
parents:
diff changeset
23 char *Func1() {
kono
parents:
diff changeset
24 char local[kSize];
kono
parents:
diff changeset
25 return Ident(local);
kono
parents:
diff changeset
26 }
kono
parents:
diff changeset
27
kono
parents:
diff changeset
28 __attribute__((noinline))
kono
parents:
diff changeset
29 void Func2(char *x) {
kono
parents:
diff changeset
30 fprintf(stderr, "2: %p\n", x);
kono
parents:
diff changeset
31 *x = 1;
kono
parents:
diff changeset
32 }
kono
parents:
diff changeset
33
kono
parents:
diff changeset
34 void *Thread(void *unused) {
kono
parents:
diff changeset
35 Func2(Func1());
kono
parents:
diff changeset
36 return NULL;
kono
parents:
diff changeset
37 }
kono
parents:
diff changeset
38
kono
parents:
diff changeset
39 int main(int argc, char **argv) {
kono
parents:
diff changeset
40 #if UseThread
kono
parents:
diff changeset
41 pthread_t t;
kono
parents:
diff changeset
42 pthread_create(&t, 0, Thread, 0);
kono
parents:
diff changeset
43 pthread_join(t, 0);
kono
parents:
diff changeset
44 #else
kono
parents:
diff changeset
45 Func2(Func1());
kono
parents:
diff changeset
46 #endif
kono
parents:
diff changeset
47 return 0;
kono
parents:
diff changeset
48 }
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 /* { dg-output "WRITE of size 1 at .* thread T0.*" } */
kono
parents:
diff changeset
51 /* { dg-output " #0.*(Func2)?.*use-after-return-1.(c:31)?.*" } */
kono
parents:
diff changeset
52 /* { dg-output "is located in stack of thread T0 at offset.*" } */
kono
parents:
diff changeset
53 /* { dg-output "\'local\' <== Memory access at offset 32 is inside this variable" } */