aboutsummaryrefslogtreecommitdiff
path: root/lib/asan/asan_activation.cc
blob: eb4a6db0b85ee901e429fc03dd642852ca3f3a87 (plain) (blame)
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
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