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