aboutsummaryrefslogtreecommitdiff
path: root/lib/asan/asan_activation.cc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/asan/asan_activation.cc')
-rw-r--r--lib/asan/asan_activation.cc88
1 files changed, 88 insertions, 0 deletions
diff --git a/lib/asan/asan_activation.cc b/lib/asan/asan_activation.cc
new file mode 100644
index 000000000000..eb4a6db0b85e
--- /dev/null
+++ b/lib/asan/asan_activation.cc
@@ -0,0 +1,88 @@
+//===-- asan_activation.cc --------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file is a part of AddressSanitizer, an address sanity checker.
+//
+// ASan activation/deactivation logic.
+//===----------------------------------------------------------------------===//
+
+#include "asan_activation.h"
+#include "asan_allocator.h"
+#include "asan_flags.h"
+#include "asan_internal.h"
+#include "sanitizer_common/sanitizer_flags.h"
+
+namespace __asan {
+
+static struct AsanDeactivatedFlags {
+ int quarantine_size;
+ int max_redzone;
+ int malloc_context_size;
+ bool poison_heap;
+ bool alloc_dealloc_mismatch;
+ bool allocator_may_return_null;
+} asan_deactivated_flags;
+
+static bool asan_is_deactivated;
+
+void AsanStartDeactivated() {
+ VReport(1, "Deactivating ASan\n");
+ // Save flag values.
+ asan_deactivated_flags.quarantine_size = flags()->quarantine_size;
+ asan_deactivated_flags.max_redzone = flags()->max_redzone;
+ asan_deactivated_flags.poison_heap = flags()->poison_heap;
+ asan_deactivated_flags.malloc_context_size =
+ common_flags()->malloc_context_size;
+ asan_deactivated_flags.alloc_dealloc_mismatch =
+ flags()->alloc_dealloc_mismatch;
+ asan_deactivated_flags.allocator_may_return_null =
+ common_flags()->allocator_may_return_null;
+
+ flags()->quarantine_size = 0;
+ flags()->max_redzone = 16;
+ flags()->poison_heap = false;
+ common_flags()->malloc_context_size = 0;
+ flags()->alloc_dealloc_mismatch = false;
+ common_flags()->allocator_may_return_null = true;
+
+ asan_is_deactivated = true;
+}
+
+void AsanActivate() {
+ if (!asan_is_deactivated) return;
+ VReport(1, "Activating ASan\n");
+
+ // Restore flag values.
+ // FIXME: this is not atomic, and there may be other threads alive.
+ flags()->quarantine_size = asan_deactivated_flags.quarantine_size;
+ flags()->max_redzone = asan_deactivated_flags.max_redzone;
+ flags()->poison_heap = asan_deactivated_flags.poison_heap;
+ common_flags()->malloc_context_size =
+ asan_deactivated_flags.malloc_context_size;
+ flags()->alloc_dealloc_mismatch =
+ asan_deactivated_flags.alloc_dealloc_mismatch;
+ common_flags()->allocator_may_return_null =
+ asan_deactivated_flags.allocator_may_return_null;
+
+ ParseExtraActivationFlags();
+
+ ReInitializeAllocator();
+
+ asan_is_deactivated = false;
+ VReport(
+ 1,
+ "quarantine_size %d, max_redzone %d, poison_heap %d, "
+ "malloc_context_size %d, alloc_dealloc_mismatch %d, "
+ "allocator_may_return_null %d\n",
+ flags()->quarantine_size, flags()->max_redzone, flags()->poison_heap,
+ common_flags()->malloc_context_size, flags()->alloc_dealloc_mismatch,
+ common_flags()->allocator_may_return_null);
+}
+
+} // namespace __asan