Imported Upstream version 4.8.1
[platform/upstream/gcc48.git] / gcc / testsuite / g++.dg / asan / deep-stack-uaf-1.C
1 // Check that we can store lots of stack frames if asked to.
2
3 // { dg-do run }
4 // { dg-skip-if "" { *-*-* } { "-flto" } { "" } }
5 // { dg-set-target-env-var ASAN_OPTIONS "malloc_context_size=120:redzone=512" }
6 // { dg-options "-fno-omit-frame-pointer -fno-optimize-sibling-calls" }
7 // { dg-additional-options "-mno-omit-leaf-frame-pointer" { target { i?86-*-* x86_64-*-* } } }
8 // { dg-shouldfail "asan" }
9
10 #include <stdlib.h>
11 #include <stdio.h>
12
13 template <int depth>
14 struct DeepFree {
15   static void __attribute__((noinline))
16   free(char *x) {
17     DeepFree<depth - 1>::free(x);
18   }
19 };
20
21 template<>
22 struct DeepFree<0> {
23   static void __attribute__((noinline))
24   free(char *x) {
25     ::free(x);
26   }
27 };
28
29 int main() {
30   char *x = (char*)malloc(10);
31   // deep_free(x);
32   DeepFree<200>::free(x);
33   return x[5];
34 }
35
36 // { dg-output "ERROR: AddressSanitizer:? heap-use-after-free on address.*(\n|\r\n|\r)" }
37 // { dg-output "    #37 0x\[0-9a-f\]+ (in \[^\n\r]*DeepFree\[^\n\r]*36|\[(\]).*(\n|\r\n|\r)" }
38 // { dg-output "    #99 0x\[0-9a-f\]+ (in \[^\n\r]*DeepFree\[^\n\r]*98|\[(\]).*(\n|\r\n|\r)" }
39 // { dg-output "    #116 0x\[0-9a-f\]+ (in \[^\n\r]*DeepFree\[^\n\r]*115|\[(\])\[^\n\r]*(\n|\r\n|\r)" }