1 //===-- asan_report.h -------------------------------------------*- C++ -*-===// 2 // 3 // This file is distributed under the University of Illinois Open Source 4 // License. See LICENSE.TXT for details. 5 // 6 //===----------------------------------------------------------------------===// 7 // 8 // This file is a part of AddressSanitizer, an address sanity checker. 9 // 10 // ASan-private header for error reporting functions. 11 //===----------------------------------------------------------------------===// 12 13 #include "asan_allocator.h" 14 #include "asan_internal.h" 15 #include "asan_thread.h" 16 17 namespace __asan { 18 19 struct StackVarDescr { 20 uptr beg; 21 uptr size; 22 const char *name_pos; 23 uptr name_len; 24 }; 25 26 struct AddressDescription { 27 char *name; 28 uptr name_size; 29 uptr region_address; 30 uptr region_size; 31 const char *region_kind; 32 }; 33 34 // The following functions prints address description depending 35 // on the memory type (shadow/heap/stack/global). 36 void DescribeHeapAddress(uptr addr, uptr access_size); 37 bool DescribeAddressIfGlobal(uptr addr, uptr access_size); 38 bool DescribeAddressRelativeToGlobal(uptr addr, uptr access_size, 39 const __asan_global &g); 40 bool IsAddressNearGlobal(uptr addr, const __asan_global &g); 41 bool GetInfoForAddressIfGlobal(uptr addr, AddressDescription *descr); 42 bool DescribeAddressIfShadow(uptr addr, AddressDescription *descr = nullptr, 43 bool print = true); 44 bool ParseFrameDescription(const char *frame_descr, 45 InternalMmapVector<StackVarDescr> *vars); 46 bool DescribeAddressIfStack(uptr addr, uptr access_size); 47 // Determines memory type on its own. 48 void DescribeAddress(uptr addr, uptr access_size); 49 50 void DescribeThread(AsanThreadContext *context); 51 52 // Different kinds of error reports. 53 void NORETURN 54 ReportStackOverflow(uptr pc, uptr sp, uptr bp, void *context, uptr addr); 55 void NORETURN ReportSIGSEGV(const char *description, uptr pc, uptr sp, uptr bp, 56 void *context, uptr addr); 57 void NORETURN ReportNewDeleteSizeMismatch(uptr addr, uptr delete_size, 58 BufferedStackTrace *free_stack); 59 void NORETURN ReportDoubleFree(uptr addr, BufferedStackTrace *free_stack); 60 void NORETURN ReportFreeNotMalloced(uptr addr, BufferedStackTrace *free_stack); 61 void NORETURN ReportAllocTypeMismatch(uptr addr, BufferedStackTrace *free_stack, 62 AllocType alloc_type, 63 AllocType dealloc_type); 64 void NORETURN 65 ReportMallocUsableSizeNotOwned(uptr addr, BufferedStackTrace *stack); 66 void NORETURN 67 ReportSanitizerGetAllocatedSizeNotOwned(uptr addr, 68 BufferedStackTrace *stack); 69 void NORETURN 70 ReportStringFunctionMemoryRangesOverlap(const char *function, 71 const char *offset1, uptr length1, 72 const char *offset2, uptr length2, 73 BufferedStackTrace *stack); 74 void NORETURN ReportStringFunctionSizeOverflow(uptr offset, uptr size, 75 BufferedStackTrace *stack); 76 void NORETURN 77 ReportBadParamsToAnnotateContiguousContainer(uptr beg, uptr end, 78 uptr old_mid, uptr new_mid, 79 BufferedStackTrace *stack); 80 81 void NORETURN 82 ReportODRViolation(const __asan_global *g1, u32 stack_id1, 83 const __asan_global *g2, u32 stack_id2); 84 85 // Mac-specific errors and warnings. 86 void WarnMacFreeUnallocated(uptr addr, uptr zone_ptr, const char *zone_name, 87 BufferedStackTrace *stack); 88 void NORETURN ReportMacMzReallocUnknown(uptr addr, uptr zone_ptr, 89 const char *zone_name, 90 BufferedStackTrace *stack); 91 void NORETURN ReportMacCfReallocUnknown(uptr addr, uptr zone_ptr, 92 const char *zone_name, 93 BufferedStackTrace *stack); 94 95 } // namespace __asan 96