16efa4d6cf9bb214a5e8ddbb224a69b38c4ae6de6Alexey Samsonov// RUN: %clangxx_asan -O1 %s -o %t 22d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: not %run %t 0 2>&1 | FileCheck %s --check-prefix=CHECK0 32d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: not %run %t 1 2>&1 | FileCheck %s --check-prefix=CHECK1 42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: not %run %t 2 2>&1 | FileCheck %s --check-prefix=CHECK2 52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: not %run %t 3 2>&1 | FileCheck %s --check-prefix=CHECK3 650f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany 750f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany#define NOINLINE __attribute__((noinline)) 850f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryanyinline void break_optimization(void *arg) { 950f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany __asm__ __volatile__("" : : "r" (arg) : "memory"); 1050f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany} 1150f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany 1250f3daa00d3da0a80c8798a3e977705e96ec106fKostya SerebryanyNOINLINE static void Frame0(int frame, char *a, char *b, char *c) { 1350f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany char s[4] = {0}; 1450f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany char *d = s; 1550f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany break_optimization(&d); 1650f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany switch (frame) { 1750f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany case 3: a[5]++; break; 1850f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany case 2: b[5]++; break; 1950f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany case 1: c[5]++; break; 2050f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany case 0: d[5]++; break; 2150f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany } 2250f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany} 2350f3daa00d3da0a80c8798a3e977705e96ec106fKostya SerebryanyNOINLINE static void Frame1(int frame, char *a, char *b) { 2450f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany char c[4] = {0}; Frame0(frame, a, b, c); 2550f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany break_optimization(0); 2650f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany} 2750f3daa00d3da0a80c8798a3e977705e96ec106fKostya SerebryanyNOINLINE static void Frame2(int frame, char *a) { 2850f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany char b[4] = {0}; Frame1(frame, a, b); 2950f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany break_optimization(0); 3050f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany} 3150f3daa00d3da0a80c8798a3e977705e96ec106fKostya SerebryanyNOINLINE static void Frame3(int frame) { 3250f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany char a[4] = {0}; Frame2(frame, a); 3350f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany break_optimization(0); 3450f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany} 3550f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany 3650f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryanyint main(int argc, char **argv) { 3750f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany if (argc != 2) return 1; 3850f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany Frame3(argv[1][0] - '0'); 3950f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany} 4050f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany 4150f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany// CHECK0: AddressSanitizer: stack-buffer-overflow 4250f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany// CHECK0: #0{{.*}}Frame0 4350f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany// CHECK0: #1{{.*}}Frame1 4450f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany// CHECK0: #2{{.*}}Frame2 4550f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany// CHECK0: #3{{.*}}Frame3 4650f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany// CHECK0: is located in stack of thread T0 at offset 4750f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany// CHECK0-NEXT: #0{{.*}}Frame0 4850f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany// 4950f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany// CHECK1: AddressSanitizer: stack-buffer-overflow 5050f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany// CHECK1: is located in stack of thread T0 at offset 5150f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany// CHECK1-NEXT: #0{{.*}}Frame1 5250f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany// 5350f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany// CHECK2: AddressSanitizer: stack-buffer-overflow 5450f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany// CHECK2: is located in stack of thread T0 at offset 5550f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany// CHECK2-NEXT: #0{{.*}}Frame2 5650f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany// 5750f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany// CHECK3: AddressSanitizer: stack-buffer-overflow 5850f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany// CHECK3: is located in stack of thread T0 at offset 5950f3daa00d3da0a80c8798a3e977705e96ec106fKostya Serebryany// CHECK3-NEXT: #0{{.*}}Frame3 60