asan_allocator.h revision 3c80c6c574850106481f82b9e23d1c728458d4a9
1893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project//===-- asan_allocator.h ----------------------------------------*- C++ -*-===//
2893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project//
3893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project//                     The LLVM Compiler Infrastructure
4893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project//
5893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project// This file is distributed under the University of Illinois Open Source
6893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project// License. See LICENSE.TXT for details.
7893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project//
8893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project//===----------------------------------------------------------------------===//
9893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project//
10893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project// This file is a part of AddressSanitizer, an address sanity checker.
11893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project//
12893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project// ASan-private header for asan_allocator2.cc.
13893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project//===----------------------------------------------------------------------===//
14893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
15893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#ifndef ASAN_ALLOCATOR_H
16893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define ASAN_ALLOCATOR_H
17893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
18893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include "asan_internal.h"
19893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include "asan_interceptors.h"
20893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include "sanitizer_common/sanitizer_list.h"
21893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
22893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectnamespace __asan {
23893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
24893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectenum AllocType {
25893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  FROM_MALLOC = 1,  // Memory block came from malloc, calloc, realloc, etc.
26893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  FROM_NEW = 2,     // Memory block came from operator new.
27893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  FROM_NEW_BR = 3   // Memory block came from operator new [ ]
28893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project};
29893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
30893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic const uptr kNumberOfSizeClasses = 255;
31893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstruct AsanChunk;
32893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
33893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid InitializeAllocator();
34893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
35893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectclass AsanChunkView {
36893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project public:
37893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  explicit AsanChunkView(AsanChunk *chunk) : chunk_(chunk) {}
38893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  bool IsValid() { return chunk_ != 0; }
39893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  uptr Beg();       // first byte of user memory.
40893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  uptr End();       // last byte of user memory.
41893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  uptr UsedSize();  // size requested by the user.
42893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  uptr AllocTid();
43893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  uptr FreeTid();
44893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  void GetAllocStack(StackTrace *stack);
45893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  void GetFreeStack(StackTrace *stack);
46893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  bool AddrIsInside(uptr addr, uptr access_size, sptr *offset) {
47893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if (addr >= Beg() && (addr + access_size) <= End()) {
48893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      *offset = addr - Beg();
49893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return true;
50893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    }
51893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    return false;
52893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  }
53893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  bool AddrIsAtLeft(uptr addr, uptr access_size, sptr *offset) {
54893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    (void)access_size;
55893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if (addr < Beg()) {
56893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      *offset = Beg() - addr;
57893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return true;
58893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    }
59893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    return false;
60893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  }
61893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  bool AddrIsAtRight(uptr addr, uptr access_size, sptr *offset) {
62893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    if (addr + access_size > End()) {
63893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      *offset = addr - End();
64893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return true;
65893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    }
66893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    return false;
67893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  }
68893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
69893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project private:
70893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  AsanChunk *const chunk_;
71893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project};
72893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
73893912bfc2683463dc3e2c445336752d012563d3The Android Open Source ProjectAsanChunkView FindHeapChunkByAddress(uptr address);
74893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
75893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project// List of AsanChunks with total size.
76893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectclass AsanChunkFifoList: public IntrusiveList<AsanChunk> {
77893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project public:
78893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  explicit AsanChunkFifoList(LinkerInitialized) { }
79893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  AsanChunkFifoList() { clear(); }
80893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  void Push(AsanChunk *n);
81893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  void PushList(AsanChunkFifoList *q);
82893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  AsanChunk *Pop();
83893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  uptr size() { return size_; }
84893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  void clear() {
85893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    IntrusiveList<AsanChunk>::clear();
86893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    size_ = 0;
87893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  }
88893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project private:
89893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  uptr size_;
90893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project};
91893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
92893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstruct AsanThreadLocalMallocStorage {
93893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  explicit AsanThreadLocalMallocStorage(LinkerInitialized x)
94893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      { }
95893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  AsanThreadLocalMallocStorage() {
96893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    CHECK(REAL(memset));
97893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    REAL(memset)(this, 0, sizeof(AsanThreadLocalMallocStorage));
98893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  }
99893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
100893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  uptr quarantine_cache[16];
101893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  uptr allocator2_cache[96 * (512 * 8 + 16)];  // Opaque.
102893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  void CommitBack();
103893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project};
104893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
105893912bfc2683463dc3e2c445336752d012563d3The Android Open Source ProjectSANITIZER_INTERFACE_ATTRIBUTE
106893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid *asan_memalign(uptr alignment, uptr size, StackTrace *stack,
107893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                    AllocType alloc_type);
108893912bfc2683463dc3e2c445336752d012563d3The Android Open Source ProjectSANITIZER_INTERFACE_ATTRIBUTE
109893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid asan_free(void *ptr, StackTrace *stack, AllocType alloc_type);
110893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
111893912bfc2683463dc3e2c445336752d012563d3The Android Open Source ProjectSANITIZER_INTERFACE_ATTRIBUTE
112893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid *asan_malloc(uptr size, StackTrace *stack);
113893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid *asan_calloc(uptr nmemb, uptr size, StackTrace *stack);
114893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid *asan_realloc(void *p, uptr size, StackTrace *stack);
115893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid *asan_valloc(uptr size, StackTrace *stack);
116893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid *asan_pvalloc(uptr size, StackTrace *stack);
117893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
118893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectint asan_posix_memalign(void **memptr, uptr alignment, uptr size,
119893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                          StackTrace *stack);
120893912bfc2683463dc3e2c445336752d012563d3The Android Open Source ProjectSANITIZER_INTERFACE_ATTRIBUTE
121893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectuptr asan_malloc_usable_size(void *ptr, StackTrace *stack);
122893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
123893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectuptr asan_mz_size(const void *ptr);
124893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid asan_mz_force_lock();
125893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid asan_mz_force_unlock();
126893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
127893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PrintInternalAllocatorStats();
128893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
129893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}  // namespace __asan
130893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif  // ASAN_ALLOCATOR_H
131893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project