• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===-- asan_activation.cc --------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file is a part of AddressSanitizer, an address sanity checker.
11 //
12 // ASan activation/deactivation logic.
13 //===----------------------------------------------------------------------===//
14 
15 #include "asan_activation.h"
16 #include "asan_allocator.h"
17 #include "asan_flags.h"
18 #include "asan_internal.h"
19 #include "sanitizer_common/sanitizer_flags.h"
20 
21 namespace __asan {
22 
23 static struct AsanDeactivatedFlags {
24   int quarantine_size;
25   int max_redzone;
26   int malloc_context_size;
27   bool poison_heap;
28 } asan_deactivated_flags;
29 
30 static bool asan_is_deactivated;
31 
AsanStartDeactivated()32 void AsanStartDeactivated() {
33   VReport(1, "Deactivating ASan\n");
34   // Save flag values.
35   asan_deactivated_flags.quarantine_size = flags()->quarantine_size;
36   asan_deactivated_flags.max_redzone = flags()->max_redzone;
37   asan_deactivated_flags.poison_heap = flags()->poison_heap;
38   asan_deactivated_flags.malloc_context_size =
39       common_flags()->malloc_context_size;
40 
41   flags()->quarantine_size = 0;
42   flags()->max_redzone = 16;
43   flags()->poison_heap = false;
44   common_flags()->malloc_context_size = 0;
45 
46   asan_is_deactivated = true;
47 }
48 
AsanActivate()49 void AsanActivate() {
50   if (!asan_is_deactivated) return;
51   VReport(1, "Activating ASan\n");
52 
53   // Restore flag values.
54   // FIXME: this is not atomic, and there may be other threads alive.
55   flags()->quarantine_size = asan_deactivated_flags.quarantine_size;
56   flags()->max_redzone = asan_deactivated_flags.max_redzone;
57   flags()->poison_heap = asan_deactivated_flags.poison_heap;
58   common_flags()->malloc_context_size =
59       asan_deactivated_flags.malloc_context_size;
60 
61   ParseExtraActivationFlags();
62 
63   ReInitializeAllocator();
64 
65   asan_is_deactivated = false;
66   VReport(
67       1,
68       "quarantine_size %d, max_redzone %d, poison_heap %d, malloc_context_size "
69       "%d\n",
70       flags()->quarantine_size, flags()->max_redzone, flags()->poison_heap,
71       common_flags()->malloc_context_size);
72 }
73 
74 }  // namespace __asan
75