1 // Regression test for https://github.com/google/sanitizers/issues/691
2 
3 // RUN: %clangxx_asan -O0 %s -o %t -fstack-protector
4 // RUN: %run %t 1 2>&1 | FileCheck %s
5 // RUN: %run %t 2 2>&1 | FileCheck %s
6 
7 #include <stdio.h>
8 #include <string.h>
9 
10 // MSVC provides _alloca instead of alloca.
11 #if defined(_MSC_VER) && !defined(alloca)
12 # define alloca _alloca
13 #else
14 #include <alloca.h>
15 #endif
16 
17 
f1_alloca()18 void f1_alloca() {
19   char *dynamic_buffer = (char *)alloca(200);
20   fprintf(stderr, "dynamic_buffer = %p\n", dynamic_buffer);
21   memset(dynamic_buffer, 'y', 200);
22   return;
23 }
24 
25 static const int kDynamicArraySize = 200;
26 
f1_vla()27 void f1_vla() {
28   char dynamic_buffer[kDynamicArraySize];
29   fprintf(stderr, "dynamic_buffer = %p\n", dynamic_buffer);
30   memset(dynamic_buffer, 'y', kDynamicArraySize);
31   return;
32 }
33 
f2()34 void f2() {
35   char buf[1024];
36   memset(buf, 'x', 1024);
37 }
38 
main(int argc,const char * argv[])39 int main(int argc, const char *argv[]) {
40   if (!strcmp(argv[1], "1")) {
41     f1_alloca();
42   } else if (!strcmp(argv[1], "2")) {
43     f1_vla();
44   }
45   f2();
46   fprintf(stderr, "Done.\n");
47   return 0;
48 }
49 
50 // CHECK-NOT: ERROR: AddressSanitizer
51 // CHECK: Done.
52