diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2016-04-11 22:28:13 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2016-04-11 22:28:13 +0000 |
commit | 9f41c7870d5bc0f5e2162770a01e9c8a6263403d (patch) | |
tree | f0bc441fb5cb303340268780a10d2a813b8dc82b /test/safestack | |
parent | 12d2fe2a170a5be91dddef5555b7f21a36e3a704 (diff) |
[safestack] A test for stackprotector canaries.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@266006 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/safestack')
-rw-r--r-- | test/safestack/canary.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/test/safestack/canary.c b/test/safestack/canary.c new file mode 100644 index 000000000..b316aa240 --- /dev/null +++ b/test/safestack/canary.c @@ -0,0 +1,37 @@ +// RUN: %clang_safestack -g %s -o %t.nossp +// RUN: %run %t.nossp 2>&1 | FileCheck --check-prefix=NOSSP %s + +// RUN: %clang_safestack -fstack-protector-all -g %s -o %t.ssp +// RUN: not --crash %run %t.ssp 2>&1 | FileCheck -check-prefix=SSP %s + +// Test stack canaries on the unsafe stack. + +// REQUIRES: stable-runtime + +#include <assert.h> +#include <stdio.h> +#include <string.h> + +__attribute__((noinline)) void f(unsigned *y) { + char x; + char *volatile p = &x; + char *volatile q = (char *)y; + assert(p < q); + assert(q - p < 1024); // sanity + // This has technically undefined behavior, but we know the actual layout of + // the unsafe stack and this should not touch anything important. + memset(&x, 0xab, q - p + sizeof(*y)); +} + +int main(int argc, char **argv) +{ + unsigned y; + // NOSSP: main 1 + // SSP: main 1 + fprintf(stderr, "main 1\n"); + f(&y); + // NOSSP: main 2 + // SSP-NOT: main 2 + fprintf(stderr, "main 2\n"); + return 0; +} |