1*8a570a87SEvgenii Stepanov // RUN: %clang_hwasan -O0 %s -o %t && %run %t 2>&1
2*8a570a87SEvgenii Stepanov 
3*8a570a87SEvgenii Stepanov // REQUIRES: aarch64-target-arch || x86_64-target-arch
4*8a570a87SEvgenii Stepanov // REQUIRES: pointer-tagging
5*8a570a87SEvgenii Stepanov 
6*8a570a87SEvgenii Stepanov #include <assert.h>
7*8a570a87SEvgenii Stepanov #include <pthread.h>
8*8a570a87SEvgenii Stepanov #include <sanitizer/hwasan_interface.h>
9*8a570a87SEvgenii Stepanov #include <stdio.h>
10*8a570a87SEvgenii Stepanov #include <stdlib.h>
11*8a570a87SEvgenii Stepanov #include <sys/types.h>
12*8a570a87SEvgenii Stepanov #include <sys/wait.h>
13*8a570a87SEvgenii Stepanov #include <unistd.h>
14*8a570a87SEvgenii Stepanov 
15*8a570a87SEvgenii Stepanov void *volatile sink;
16*8a570a87SEvgenii Stepanov 
main(int argc,char ** argv)17*8a570a87SEvgenii Stepanov int main(int argc, char **argv) {
18*8a570a87SEvgenii Stepanov   pthread_atfork(nullptr, nullptr, []() {
19*8a570a87SEvgenii Stepanov     alarm(5);
20*8a570a87SEvgenii Stepanov     sink = malloc(10);
21*8a570a87SEvgenii Stepanov   });
22*8a570a87SEvgenii Stepanov   int pid = fork();
23*8a570a87SEvgenii Stepanov   if (pid) {
24*8a570a87SEvgenii Stepanov     int wstatus;
25*8a570a87SEvgenii Stepanov     do {
26*8a570a87SEvgenii Stepanov       waitpid(pid, &wstatus, 0);
27*8a570a87SEvgenii Stepanov     } while (!WIFEXITED(wstatus) && !WIFSIGNALED(wstatus));
28*8a570a87SEvgenii Stepanov     if (!WIFEXITED(wstatus) || WEXITSTATUS(wstatus)) {
29*8a570a87SEvgenii Stepanov       fprintf(stderr, "abnormal exit\n");
30*8a570a87SEvgenii Stepanov       return 1;
31*8a570a87SEvgenii Stepanov     }
32*8a570a87SEvgenii Stepanov   }
33*8a570a87SEvgenii Stepanov   return 0;
34*8a570a87SEvgenii Stepanov }
35