12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -DWAIT -O0 %s -o %t && not %run %t 2>&1 | FileCheck %s 22d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -DWAIT -O3 %s -o %t && not %run %t 2>&1 | FileCheck %s 32d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -DWAITPID -O0 %s -o %t && not %run %t 2>&1 | FileCheck %s 52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -DWAITPID -O3 %s -o %t && not %run %t 2>&1 | FileCheck %s 62d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 72d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -DWAIT3 -O0 %s -o %t && not %run %t 2>&1 | FileCheck %s 82d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -DWAIT3 -O3 %s -o %t && not %run %t 2>&1 | FileCheck %s 92d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -DWAIT3_RUSAGE -O0 %s -o %t && not %run %t 2>&1 | FileCheck %s 112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -DWAIT3_RUSAGE -O3 %s -o %t && not %run %t 2>&1 | FileCheck %s 122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <assert.h> 152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <sys/wait.h> 162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <unistd.h> 172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint main(int argc, char **argv) { 192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines pid_t pid = fork(); 202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (pid) { // parent 212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int x[3]; 222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int *status = x + argc * 3; 232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int res; 242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#if defined(WAIT) 252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines res = wait(status); 262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#elif defined(WAITPID) 272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines res = waitpid(pid, status, WNOHANG); 282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#elif defined(WAIT3) 292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines res = wait3(status, WNOHANG, NULL); 306d1862363c88c183b0ed7740fca876342cf0474bStephen Hines#elif defined(WAIT3_RUSAGE) 312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct rusage *ru = (struct rusage*)(x + argc * 3); 322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int good_status; 332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines res = wait3(&good_status, WNOHANG, ru); 342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif 352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // CHECK: stack-buffer-overflow 362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // CHECK: {{WRITE of size .* at 0x.* thread T0}} 372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // CHECK: {{in .*wait}} 382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // CHECK: {{in main .*wait.cc:}} 392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // CHECK: is located in stack of thread T0 at offset 402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // CHECK: {{in main}} 412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return res == -1 ? 1 : 0; 422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // child 442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return 0; 452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 46