diff options
author | Derek Bruening <bruening@google.com> | 2016-05-11 15:47:54 +0000 |
---|---|---|
committer | Derek Bruening <bruening@google.com> | 2016-05-11 15:47:54 +0000 |
commit | b81c9a9cdf20fef726b4e266fcb07e8cae079d9b (patch) | |
tree | e12d7266248c4c3b336c27a6ca237bf6aec0d35e /test/esan | |
parent | d9d88a21279956a38c0b7176b3cbadcd259e1412 (diff) |
[esan] EfficiencySanitizer shadow memory
Summary:
Adds shadow memory mapping support common to all tools to the new
Efficiencysanitizer ("esan") family of tools. This includes:
+ Shadow memory layout and mapping support for 64-bit Linux for any
power-of-2 scale-down (1x, 2x, 4x, 8x, 16x, etc.) that ensures that
shadow(shadow(address)) does not overlap shadow or application
memory.
+ Mmap interception to ensure the application does not map on top of
our shadow memory.
+ Init-time sanity checks for shadow regions.
+ A test of the mmap conflict mechanism.
Reviewers: aizatsky, filcab
Subscribers: filcab, kubabrecka, llvm-commits, vitalybuka, eugenis, kcc, zhaoqin
Differential Revision: http://reviews.llvm.org/D19921
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@269198 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/esan')
-rw-r--r-- | test/esan/TestCases/mmap-shadow-conflict.c | 29 | ||||
-rw-r--r-- | test/esan/TestCases/verbose-simple.c | 4 |
2 files changed, 33 insertions, 0 deletions
diff --git a/test/esan/TestCases/mmap-shadow-conflict.c b/test/esan/TestCases/mmap-shadow-conflict.c new file mode 100644 index 000000000..9790975b1 --- /dev/null +++ b/test/esan/TestCases/mmap-shadow-conflict.c @@ -0,0 +1,29 @@ +// RUN: %clang_esan_frag -O0 %s -o %t 2>&1 +// RUN: %env_esan_opts=verbosity=1 %run %t 2>&1 | FileCheck %s + +#include <unistd.h> +#include <sys/mman.h> +#include <stdio.h> + +int main(int argc, char **argv) { + void *Map = mmap((void *)0x0000016000000000ULL, 0x1000, PROT_READ, + MAP_ANON|MAP_PRIVATE|MAP_FIXED, -1, 0); + if (Map == (void *)-1) + fprintf(stderr, "map failed\n"); + else + fprintf(stderr, "mapped %p\n", Map); + Map = mmap((void *)0x0000016000000000ULL, 0x1000, PROT_READ, + MAP_ANON|MAP_PRIVATE, -1, 0); + fprintf(stderr, "mapped %p\n", Map); + // CHECK: in esan::initializeLibrary + // CHECK-NEXT: Shadow scale=2 offset=0x440000000000 + // CHECK-NEXT: Shadow #0: [110000000000-114000000000) (256GB) + // CHECK-NEXT: Shadow #1: [124000000000-12c000000000) (512GB) + // CHECK-NEXT: Shadow #2: [14c000000000-150000000000) (256GB) + // CHECK-NEXT: mmap conflict: {{.*}} + // CHECK-NEXT: map failed + // CHECK-NEXT: mmap conflict: {{.*}} + // CHECK-NEXT: mapped {{.*}} + // CHECK-NEXT: in esan::finalizeLibrary + return 0; +} diff --git a/test/esan/TestCases/verbose-simple.c b/test/esan/TestCases/verbose-simple.c index 76869b6af..d8e5bced6 100644 --- a/test/esan/TestCases/verbose-simple.c +++ b/test/esan/TestCases/verbose-simple.c @@ -3,6 +3,10 @@ int main(int argc, char **argv) { // CHECK: in esan::initializeLibrary + // CHECK-NEXT: Shadow scale=2 offset=0x440000000000 + // CHECK-NEXT: Shadow #0: [110000000000-114000000000) (256GB) + // CHECK-NEXT: Shadow #1: [124000000000-12c000000000) (512GB) + // CHECK-NEXT: Shadow #2: [14c000000000-150000000000) (256GB) // CHECK-NEXT: in esan::finalizeLibrary // CHECK-NEXT: {{.*}}EfficiencySanitizer is not finished: nothing yet to report return 0; |