1 // Test how stack frames are reported (not fully implemented yet).
2 // RUN: %clang_hwasan %s -o %t
3 // RUN: not %run %t 3 2 -1 2>&1 | FileCheck %s --check-prefix=R321
4 // REQUIRES: stable-runtime
7 void USE(void *x
) { // pretend_to_do_something(void *x)
8 __asm__
__volatile__("" : : "r" (x
) : "memory");
10 void USE2(void *a
, void *b
) { USE(a
); USE(b
); }
11 void USE4(void *a
, void *b
, void *c
, void *d
) { USE2(a
, b
); USE2(c
, d
); }
13 void BAR(int depth
, int err_depth
, int offset
);
17 void FOO(int depth
, int err_depth
, int offset
) {
25 USE4(&v1
, &v2
, &v4
, &v8
); USE4(&v16
, &v32
, &v48
, 0);
28 BAR(depth
- 1, err_depth
, offset
);
30 if (err_depth
== depth
)
31 v16
[offset
] = 0; // maybe OOB.
32 if (err_depth
== -depth
)
33 leaked_ptr
[offset
] = 0; // maybe UAR.
37 void BAR(int depth
, int err_depth
, int offset
) {
43 FOO(depth
- 1, err_depth
, offset
);
44 if (err_depth
== depth
)
45 x16
[offset
] = 0; // maybe OOB
46 if (err_depth
== -depth
)
47 leaked_ptr
[offset
] = 0; // maybe UAR
52 int main(int argc
, char **argv
) {
53 if (argc
!= 4) return -1;
54 int depth
= atoi(argv
[1]);
55 int err_depth
= atoi(argv
[2]);
56 int offset
= atoi(argv
[3]);
57 FOO(depth
, err_depth
, offset
);
61 // R321: HWAddressSanitizer: tag-mismatch
62 // R321-NEXT: WRITE of size 8
66 // R321: is located in stack of thread T0