xref: /llvm-project/compiler-rt/test/hwasan/TestCases/Linux/atfork.cpp (revision 847fa84b3d346313bbad31d4c76b0f70d73827aa)
18a570a87SEvgenii Stepanov // RUN: %clang_hwasan -O0 %s -o %t && %run %t 2>&1
28a570a87SEvgenii Stepanov 
3*847fa84bSAlexey Baturo // REQUIRES: aarch64-target-arch || x86_64-target-arch || riscv64-target-arch
48a570a87SEvgenii Stepanov // REQUIRES: pointer-tagging
58a570a87SEvgenii Stepanov 
68a570a87SEvgenii Stepanov #include <assert.h>
78a570a87SEvgenii Stepanov #include <pthread.h>
88a570a87SEvgenii Stepanov #include <sanitizer/hwasan_interface.h>
98a570a87SEvgenii Stepanov #include <stdio.h>
108a570a87SEvgenii Stepanov #include <stdlib.h>
118a570a87SEvgenii Stepanov #include <sys/types.h>
128a570a87SEvgenii Stepanov #include <sys/wait.h>
138a570a87SEvgenii Stepanov #include <unistd.h>
148a570a87SEvgenii Stepanov 
158a570a87SEvgenii Stepanov void *volatile sink;
168a570a87SEvgenii Stepanov 
main(int argc,char ** argv)178a570a87SEvgenii Stepanov int main(int argc, char **argv) {
188a570a87SEvgenii Stepanov   pthread_atfork(nullptr, nullptr, []() {
198a570a87SEvgenii Stepanov     alarm(5);
208a570a87SEvgenii Stepanov     sink = malloc(10);
218a570a87SEvgenii Stepanov   });
228a570a87SEvgenii Stepanov   int pid = fork();
238a570a87SEvgenii Stepanov   if (pid) {
248a570a87SEvgenii Stepanov     int wstatus;
258a570a87SEvgenii Stepanov     do {
268a570a87SEvgenii Stepanov       waitpid(pid, &wstatus, 0);
278a570a87SEvgenii Stepanov     } while (!WIFEXITED(wstatus) && !WIFSIGNALED(wstatus));
288a570a87SEvgenii Stepanov     if (!WIFEXITED(wstatus) || WEXITSTATUS(wstatus)) {
298a570a87SEvgenii Stepanov       fprintf(stderr, "abnormal exit\n");
308a570a87SEvgenii Stepanov       return 1;
318a570a87SEvgenii Stepanov     }
328a570a87SEvgenii Stepanov   }
338a570a87SEvgenii Stepanov   return 0;
348a570a87SEvgenii Stepanov }
35