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 Weberint 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