diff --git a/compiler-rt/lib/asan/asan_flags.h b/compiler-rt/lib/asan/asan_flags.h index 523302b964eb..7dc78158189f 100644 --- a/compiler-rt/lib/asan/asan_flags.h +++ b/compiler-rt/lib/asan/asan_flags.h @@ -63,6 +63,7 @@ struct Flags { bool strict_init_order; bool start_deactivated; int detect_invalid_pointer_pairs; + bool detect_container_overflow; }; extern Flags asan_flags_dont_use_directly; diff --git a/compiler-rt/lib/asan/asan_poisoning.cc b/compiler-rt/lib/asan/asan_poisoning.cc index f75ac0a4ed41..a545769bd559 100644 --- a/compiler-rt/lib/asan/asan_poisoning.cc +++ b/compiler-rt/lib/asan/asan_poisoning.cc @@ -266,6 +266,7 @@ void __sanitizer_annotate_contiguous_container(const void *beg_p, const void *end_p, const void *old_mid_p, const void *new_mid_p) { + if (!flags()->detect_container_overflow) return; VPrintf(2, "contiguous_container: %p %p %p %p\n", beg_p, end_p, old_mid_p, new_mid_p); uptr beg = reinterpret_cast(beg_p); diff --git a/compiler-rt/lib/asan/asan_report.cc b/compiler-rt/lib/asan/asan_report.cc index 9d1742202988..bece6eab36f4 100644 --- a/compiler-rt/lib/asan/asan_report.cc +++ b/compiler-rt/lib/asan/asan_report.cc @@ -141,7 +141,7 @@ static void PrintLegend(InternalScopedString *str) { kAsanInitializationOrderMagic); PrintShadowByte(str, " Poisoned by user: ", kAsanUserPoisonedMemoryMagic); - PrintShadowByte(str, " Contiguous container OOB:", + PrintShadowByte(str, " Container overflow: ", kAsanContiguousContainerOOBMagic); PrintShadowByte(str, " ASan internal: ", kAsanInternalHeapMagic); } diff --git a/compiler-rt/lib/asan/asan_rtl.cc b/compiler-rt/lib/asan/asan_rtl.cc index d608dd71172d..4b11f2a51b27 100644 --- a/compiler-rt/lib/asan/asan_rtl.cc +++ b/compiler-rt/lib/asan/asan_rtl.cc @@ -220,6 +220,11 @@ static void ParseFlagsFromString(Flags *f, const char *str) { "If non-zero, try to detect operations like <, <=, >, >= and - on " "invalid pointer pairs (e.g. when pointers belong to different objects). " "The bigger the value the harder we try."); + + ParseFlag(str, &f->detect_container_overflow, + "detect_container_overflow", + "If true, honor the container overflow annotations. " + "See https://code.google.com/p/address-sanitizer/wiki/ContainerOverflow"); } void InitializeFlags(Flags *f, const char *env) { @@ -267,6 +272,7 @@ void InitializeFlags(Flags *f, const char *env) { f->strict_init_order = false; f->start_deactivated = false; f->detect_invalid_pointer_pairs = 0; + f->detect_container_overflow = true; // Override from compile definition. ParseFlagsFromString(f, MaybeUseAsanDefaultOptionsCompileDefiniton()); diff --git a/compiler-rt/test/asan/TestCases/contiguous_container_crash.cc b/compiler-rt/test/asan/TestCases/contiguous_container_crash.cc index 6be9ad5f6c01..eba50b125629 100644 --- a/compiler-rt/test/asan/TestCases/contiguous_container_crash.cc +++ b/compiler-rt/test/asan/TestCases/contiguous_container_crash.cc @@ -1,6 +1,8 @@ // RUN: %clangxx_asan -O %s -o %t // RUN: not %t crash 2>&1 | FileCheck --check-prefix=CHECK-CRASH %s // RUN: not %t bad-bounds 2>&1 | FileCheck --check-prefix=CHECK-BAD %s +// RUN: ASAN_OPTIONS=detect_container_overflow=0 %t crash +// // Test crash due to __sanitizer_annotate_contiguous_container. #include @@ -16,6 +18,7 @@ static volatile int one = 1; int TestCrash() { long t[100]; + t[60] = 0; __sanitizer_annotate_contiguous_container(&t[0], &t[0] + 100, &t[0] + 100, &t[0] + 50); return (int)t[60 * one]; // Touches the poisoned memory.