xref: /llvm-project/compiler-rt/test/asan/TestCases/alloca_loop_unpoisoning.cpp (revision ebd4dc42630e201c15894b48c3ea890eaa8c3b18)
1673dc3d4SNico Weber // RUN: %clangxx_asan -O0 -mllvm -asan-instrument-dynamic-allocas %s -o %t
24b4437c0SVitaly Buka // RUN: %env_asan_opts=detect_stack_use_after_return=0 %run %t 2>&1
3673dc3d4SNico Weber //
4673dc3d4SNico Weber // REQUIRES: stable-runtime
5673dc3d4SNico Weber 
6673dc3d4SNico Weber // This testcase checks that allocas and VLAs inside loop are correctly unpoisoned.
7673dc3d4SNico Weber 
8673dc3d4SNico Weber #include <assert.h>
9673dc3d4SNico Weber #include <stdint.h>
10673dc3d4SNico Weber #include <stdlib.h>
11673dc3d4SNico Weber #include "sanitizer/asan_interface.h"
12673dc3d4SNico Weber 
13673dc3d4SNico Weber // MSVC provides _alloca instead of alloca.
14673dc3d4SNico Weber #if defined(_MSC_VER) && !defined(alloca)
15673dc3d4SNico Weber # define alloca _alloca
16673dc3d4SNico Weber #endif
17673dc3d4SNico Weber 
18673dc3d4SNico Weber #if defined(__sun__) && defined(__svr4__)
19673dc3d4SNico Weber #include <alloca.h>
20673dc3d4SNico Weber #endif
21673dc3d4SNico Weber 
22673dc3d4SNico Weber void *top, *bot;
23673dc3d4SNico Weber 
foo(int len)24673dc3d4SNico Weber __attribute__((noinline)) void foo(int len) {
25673dc3d4SNico Weber   char x;
26673dc3d4SNico Weber   top = &x;
27*ebd4dc42SFangrui Song   volatile char array[len];
28*ebd4dc42SFangrui Song   if (len)
29*ebd4dc42SFangrui Song     array[0] = 0;
30673dc3d4SNico Weber   assert(!(reinterpret_cast<uintptr_t>(array) & 31L));
31673dc3d4SNico Weber   alloca(len);
32673dc3d4SNico Weber   for (int i = 0; i < 32; ++i) {
33*ebd4dc42SFangrui Song     volatile char array[i];
34*ebd4dc42SFangrui Song     if (i)
35*ebd4dc42SFangrui Song       array[0] = 0;
36673dc3d4SNico Weber     bot = alloca(i);
37673dc3d4SNico Weber     assert(!(reinterpret_cast<uintptr_t>(bot) & 31L));
38673dc3d4SNico Weber   }
39673dc3d4SNico Weber }
40673dc3d4SNico Weber 
main(int argc,char ** argv)41673dc3d4SNico Weber int main(int argc, char **argv) {
42673dc3d4SNico Weber   foo(32);
43673dc3d4SNico Weber   void *q = __asan_region_is_poisoned(bot, (char *)top - (char *)bot);
44673dc3d4SNico Weber   assert(!q);
45673dc3d4SNico Weber   return 0;
46673dc3d4SNico Weber }
47