diff options
| author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2018-03-12 21:46:55 +0000 | 
|---|---|---|
| committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2018-03-12 21:46:55 +0000 | 
| commit | c2e54761c954af30b291efcc39982cbda76d250f (patch) | |
| tree | cc8c5d102f15689d329813e1341a422f6a5c1e96 | |
| parent | 8b342680bf62722e5099074e8bd23491c71d92b3 (diff) | |
| download | bcm5719-llvm-c2e54761c954af30b291efcc39982cbda76d250f.tar.gz bcm5719-llvm-c2e54761c954af30b291efcc39982cbda76d250f.zip  | |
[asan] poison_heap=0 should not disable __asan_handle_no_return.
Reviewers: kcc, alekseyshl, vitalybuka
Subscribers: kubamracek, llvm-commits
Differential Revision: https://reviews.llvm.org/D44339
llvm-svn: 327337
| -rw-r--r-- | compiler-rt/lib/asan/asan_poisoning.cc | 2 | ||||
| -rw-r--r-- | compiler-rt/lib/asan/asan_poisoning.h | 2 | ||||
| -rw-r--r-- | compiler-rt/test/asan/TestCases/handle_noreturn_bug.cc | 13 | 
3 files changed, 15 insertions, 2 deletions
diff --git a/compiler-rt/lib/asan/asan_poisoning.cc b/compiler-rt/lib/asan/asan_poisoning.cc index c3a82aa0049..62cbfe6f024 100644 --- a/compiler-rt/lib/asan/asan_poisoning.cc +++ b/compiler-rt/lib/asan/asan_poisoning.cc @@ -32,7 +32,7 @@ bool CanPoisonMemory() {  }  void PoisonShadow(uptr addr, uptr size, u8 value) { -  if (!CanPoisonMemory()) return; +  if (value && !CanPoisonMemory()) return;    CHECK(AddrIsAlignedByGranularity(addr));    CHECK(AddrIsInMem(addr));    CHECK(AddrIsAlignedByGranularity(addr + size)); diff --git a/compiler-rt/lib/asan/asan_poisoning.h b/compiler-rt/lib/asan/asan_poisoning.h index 1e00070bcf6..42cdc850ecc 100644 --- a/compiler-rt/lib/asan/asan_poisoning.h +++ b/compiler-rt/lib/asan/asan_poisoning.h @@ -38,7 +38,7 @@ void PoisonShadowPartialRightRedzone(uptr addr,  // performance-critical code with care.  ALWAYS_INLINE void FastPoisonShadow(uptr aligned_beg, uptr aligned_size,                                      u8 value) { -  DCHECK(CanPoisonMemory()); +  DCHECK(!value || CanPoisonMemory());    uptr shadow_beg = MEM_TO_SHADOW(aligned_beg);    uptr shadow_end = MEM_TO_SHADOW(        aligned_beg + aligned_size - SHADOW_GRANULARITY) + 1; diff --git a/compiler-rt/test/asan/TestCases/handle_noreturn_bug.cc b/compiler-rt/test/asan/TestCases/handle_noreturn_bug.cc new file mode 100644 index 00000000000..8c3c66a423d --- /dev/null +++ b/compiler-rt/test/asan/TestCases/handle_noreturn_bug.cc @@ -0,0 +1,13 @@ +// Regression test: __asan_handle_no_return should unpoison stack even with poison_heap=0. +// RUN: %clangxx_asan -O0 %s -o %t && \ +// RUN: %env_asan_opts=poison_heap=1 %run %t && \ +// RUN: %env_asan_opts=poison_heap=0 %run %t + +#include <sanitizer/asan_interface.h> + +int main(int argc, char **argv) { +  int x[2]; +  int * volatile p = &x[0]; +  __asan_handle_no_return(); +  int volatile z = p[2]; +}  | 

