15d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// FIXME: https://code.google.com/p/address-sanitizer/issues/detail?id=316 25d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// XFAIL: android 35d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// 42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -O0 %s -o %t && %run %t 52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -DPOSITIVE -O0 %s -o %t && not %run %t 2>&1 | FileCheck %s 65d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// XFAIL: arm-linux-gnueabi 7341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov 8341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#include <assert.h> 9341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#include <stdio.h> 10341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#include <sys/ptrace.h> 11341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#include <sys/types.h> 12341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#include <sys/user.h> 13341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#include <sys/wait.h> 14341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#include <unistd.h> 15341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov 16341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanovint main(void) { 17341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov pid_t pid; 18341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov pid = fork(); 19341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov if (pid == 0) { // child 20341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov ptrace(PTRACE_TRACEME, 0, NULL, NULL); 21341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov execl("/bin/true", "true", NULL); 22341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov } else { 23341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov wait(NULL); 24341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov user_regs_struct regs; 25341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov int res; 26341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov user_regs_struct * volatile pregs = ®s; 27341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#ifdef POSITIVE 28341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov ++pregs; 29341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#endif 30341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov res = ptrace(PTRACE_GETREGS, pid, NULL, pregs); 31341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov // CHECK: AddressSanitizer: stack-buffer-overflow 32341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov // CHECK: {{.*ptrace.cc:}}[[@LINE-2]] 33341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov assert(!res); 34341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#if __WORDSIZE == 64 35341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov printf("%zx\n", regs.rip); 36341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#else 37341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov printf("%lx\n", regs.eip); 38341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#endif 39341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov 40341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov user_fpregs_struct fpregs; 41341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov res = ptrace(PTRACE_GETFPREGS, pid, NULL, &fpregs); 42341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov assert(!res); 43341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov printf("%lx\n", (unsigned long)fpregs.cwd); 44341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov 45341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#if __WORDSIZE == 32 46341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov user_fpxregs_struct fpxregs; 47341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov res = ptrace(PTRACE_GETFPXREGS, pid, NULL, &fpxregs); 48341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov assert(!res); 49341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov printf("%lx\n", (unsigned long)fpxregs.mxcsr); 50341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#endif 51341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov 52341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov ptrace(PTRACE_CONT, pid, NULL, NULL); 53341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov wait(NULL); 54341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov } 55341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov return 0; 56341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov} 57