Home | History | Annotate | Download | only in Posix
      1 // RUN: %clangxx_asan -O0 %s -o %t && not %run %t 2>&1 | FileCheck %s
      2 // RUN: %clangxx_asan -O3 %s -o %t && not %run %t 2>&1 | FileCheck %s
      3 
      4 #include <assert.h>
      5 #include <sys/wait.h>
      6 #include <unistd.h>
      7 #include <signal.h>
      8 
      9 int main(int argc, char **argv) {
     10   pid_t pid = fork();
     11   if (pid) { // parent
     12     int x[3];
     13     int *status = x + argc * 3;
     14     int res;
     15 
     16     siginfo_t *si = (siginfo_t*)(x + argc * 3);
     17     res = waitid(P_ALL, 0, si, WEXITED | WNOHANG);
     18     // CHECK: stack-buffer-overflow
     19     // CHECK: {{WRITE of size .* at 0x.* thread T0}}
     20     // CHECK: {{in .*waitid}}
     21     // CHECK: {{in main .*waitid.cc:}}
     22     // CHECK: is located in stack of thread T0 at offset
     23     // CHECK: {{in main}}
     24     return res != -1;
     25   }
     26   // child
     27   return 0;
     28 }
     29