aboutsummaryrefslogtreecommitdiff
path: root/libsanitizer/asan/asan_activation.cc
blob: 235451c8aec24d45672d1b7a9832e6003f7c3129 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
//===-- asan_activation.cc --------------------------------------*- C++ -*-===//
//
// 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;
} 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;

  flags()->quarantine_size = 0;
  flags()->max_redzone = 16;
  flags()->poison_heap = false;
  common_flags()->malloc_context_size = 0;

  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;

  ParseExtraActivationFlags();

  ReInitializeAllocator();

  asan_is_deactivated = false;
  VReport(
      1,
      "quarantine_size %d, max_redzone %d, poison_heap %d, malloc_context_size "
      "%d\n",
      flags()->quarantine_size, flags()->max_redzone, flags()->poison_heap,
      common_flags()->malloc_context_size);
}

}  // namespace __asan