1 // Tests use-after-return detection and reporting. 2 // RUN: %clang_hwasan -O0 %s -o %t && not %run %t 2>&1 | FileCheck %s 3 4 // REQUIRES: stable-runtime 5 6 void USE(void *x) { // pretend_to_do_something(void *x) 7 __asm__ __volatile__("" : : "r" (x) : "memory"); 8 } 9 10 __attribute__((noinline)) 11 char *buggy() { 12 char zzz[0x1000]; 13 char *volatile p = zzz; 14 return p; 15 } 16 17 __attribute__((noinline)) void Unrelated1() { int A[2]; USE(&A[0]); } 18 __attribute__((noinline)) void Unrelated2() { int BB[3]; USE(&BB[0]); } 19 __attribute__((noinline)) void Unrelated3() { int CCC[4]; USE(&CCC[0]); } 20 21 int main() { 22 char *p = buggy(); 23 Unrelated1(); 24 Unrelated2(); 25 Unrelated3(); 26 return *p; 27 // CHECK: READ of size 1 at 28 // CHECK: #0 {{.*}} in main{{.*}}stack-uar.c:[[@LINE-2]] 29 // CHECK: is located in stack of thread 30 // CHECK: Previosly allocated frames: 31 // CHECK: Unrelated3 32 // CHECK: 16 CCC 33 // CHECK: Unrelated2 34 // CHECK: 12 BB 35 // CHECK: Unrelated1 36 // CHECK: 8 A 37 // CHECK: buggy 38 // CHECK: 4096 zzz 39 40 // CHECK: SUMMARY: HWAddressSanitizer: tag-mismatch {{.*}} in main 41 } 42