deep_stack_uaf.cc revision 6d924facc5c979a0d25f484cffcdb51c766ed551
16d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany// Check that we can store lots of stack frames if asked to. 26d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany 36d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany// RUN: %clangxx_asan -m64 -O0 %s -o %t 2>&1 46d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany// RUN: ASAN_OPTIONS=malloc_context_size=120:redzone=512 %t 2>&1 | \ 56d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany// RUN: %symbolize | FileCheck %s 66d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany 76d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany// RUN: %clangxx_asan -m32 -O0 %s -o %t 2>&1 86d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany// RUN: ASAN_OPTIONS=malloc_context_size=120:redzone=512 %t 2>&1 | \ 96d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany// RUN: %symbolize | FileCheck %s 106d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany#include <stdlib.h> 116d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany#include <stdio.h> 126d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany 136d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryanytemplate <int depth> 146d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryanystruct DeepFree { 156d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany static void free(char *x) { 166d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany DeepFree<depth - 1>::free(x); 176d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany } 186d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany}; 196d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany 206d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryanytemplate<> 216d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryanystruct DeepFree<0> { 226d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany static void free(char *x) { 236d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany ::free(x); 246d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany } 256d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany}; 266d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany 276d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryanyint main() { 286d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany char *x = new char[10]; 296d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany // deep_free(x); 306d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany DeepFree<200>::free(x); 316d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany return x[5]; 326d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany // CHECK: {{.*ERROR: AddressSanitizer heap-use-after-free on address}} 336d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany // CHECK: DeepFree<36> 346d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany // CHECK: DeepFree<98> 356d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany // CHECK: DeepFree<115> 366d924facc5c979a0d25f484cffcdb51c766ed551Kostya Serebryany} 37