| // RUN: %clangxx_hwasan -mllvm -hwasan-use-stack-safety=0 -mllvm -hwasan-use-after-scope -O2 %s -o %t && \ |
| // RUN: %run %t 2>&1 |
| |
| // REQUIRES: aarch64-target-arch || riscv64-target-arch |
| // REQUIRES: stable-runtime |
| |
| #include <sanitizer/hwasan_interface.h> |
| #include <setjmp.h> |
| #include <stdlib.h> |
| #include <string.h> |
| |
| #include <sys/types.h> |
| #include <unistd.h> |
| |
| volatile const char *stackbuf = nullptr; |
| jmp_buf jbuf; |
| |
| __attribute__((noinline)) bool jump() { |
| // Fool the compiler so it cannot deduce noreturn. |
| if (getpid() != 0) { |
| longjmp(jbuf, 1); |
| return true; |
| } |
| return false; |
| } |
| |
| bool target() { |
| switch (setjmp(jbuf)) { |
| case 1: |
| return false; |
| default: |
| break; |
| } |
| |
| while (true) { |
| char buf[4096]; |
| stackbuf = buf; |
| if (!jump()) { |
| break; |
| }; |
| } |
| return true; |
| } |
| |
| int main() { |
| target(); |
| |
| void *untagged = __hwasan_tag_pointer(stackbuf, 0); |
| if (stackbuf == untagged) { |
| // The buffer wasn't tagged in the first place, so the test will not work |
| // as expected. |
| return 2; |
| } |
| if (__hwasan_test_shadow(untagged, 4096) != -1) { |
| return 1; |
| } |
| |
| return 0; |
| } |