summaryrefslogtreecommitdiffstats
path: root/compiler-rt/test/shadowcallstack/overflow.c
diff options
context:
space:
mode:
Diffstat (limited to 'compiler-rt/test/shadowcallstack/overflow.c')
-rw-r--r--compiler-rt/test/shadowcallstack/overflow.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/compiler-rt/test/shadowcallstack/overflow.c b/compiler-rt/test/shadowcallstack/overflow.c
new file mode 100644
index 00000000000..b7b29a117b4
--- /dev/null
+++ b/compiler-rt/test/shadowcallstack/overflow.c
@@ -0,0 +1,36 @@
+// RUN: %clang_noscs %s -o %t
+// RUN: %run %t 3 | FileCheck %s
+// RUN: %run %t 12 | FileCheck -check-prefix=OVERFLOW_SUCCESS %s
+
+// RUN: %clang_scs %s -o %t
+// RUN: %run %t 3 | FileCheck %s
+// RUN: not --crash %run %t 12
+
+// Test that a stack overflow fails as expected
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "minimal_runtime.h"
+
+void print_and_exit(void) {
+// CHECK-NOT: Stack overflow successful.
+// OVERFLOW_SUCCESS: Stack overflow successful.
+ printf("Stack overflow successful.\n");
+ exit(0);
+}
+
+int main(int argc, char **argv)
+{
+ if (argc != 2)
+ exit(1);
+
+ void *addrs[4];
+ const int iterations = atoi(argv[1]);
+ for (int i = 0; i < iterations; i++)
+ addrs[i] = &print_and_exit;
+
+ printf("Returning.\n");
+
+ return 0;
+}
OpenPOWER on IntegriCloud