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: pointer-tagging
8 void USE(void *x
) { // pretend_to_do_something(void *x)
9 __asm__
__volatile__("" : : "r" (x
) : "memory");
11 void USE2(void *a
, void *b
) { USE(a
); USE(b
); }
12 void USE4(void *a
, void *b
, void *c
, void *d
) { USE2(a
, b
); USE2(c
, d
); }
14 void BAR(int depth
, int err_depth
, int offset
);
18 void FOO(int depth
, int err_depth
, int offset
) {
26 USE4(&v1
, &v2
, &v4
, &v8
); USE4(&v16
, &v32
, &v48
, 0);
29 BAR(depth
- 1, err_depth
, offset
);
31 if (err_depth
== depth
)
32 v16
[offset
] = 0; // maybe OOB.
33 if (err_depth
== -depth
)
34 leaked_ptr
[offset
] = 0; // maybe UAR.
38 void BAR(int depth
, int err_depth
, int offset
) {
44 FOO(depth
- 1, err_depth
, offset
);
45 if (err_depth
== depth
)
46 x16
[offset
] = 0; // maybe OOB
47 if (err_depth
== -depth
)
48 leaked_ptr
[offset
] = 0; // maybe UAR
53 int main(int argc
, char **argv
) {
54 if (argc
!= 4) return -1;
55 int depth
= atoi(argv
[1]);
56 int err_depth
= atoi(argv
[2]);
57 int offset
= atoi(argv
[3]);
58 FOO(depth
, err_depth
, offset
);
62 // R321: HWAddressSanitizer: tag-mismatch
63 // R321-NEXT: WRITE of size 8
67 // R321: is located in stack of thread T0