1 //===-- tsan_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 ThreadSanitizer (TSan), a race detector. 9 // 10 //===----------------------------------------------------------------------===// 11 #ifndef TSAN_REPORT_H 12 #define TSAN_REPORT_H 13 14 #include "sanitizer_common/sanitizer_symbolizer.h" 15 #include "sanitizer_common/sanitizer_vector.h" 16 #include "tsan_defs.h" 17 18 namespace __tsan { 19 20 enum ReportType { 21 ReportTypeRace, 22 ReportTypeVptrRace, 23 ReportTypeUseAfterFree, 24 ReportTypeVptrUseAfterFree, 25 ReportTypeExternalRace, 26 ReportTypeThreadLeak, 27 ReportTypeMutexDestroyLocked, 28 ReportTypeMutexDoubleLock, 29 ReportTypeMutexInvalidAccess, 30 ReportTypeMutexBadUnlock, 31 ReportTypeMutexBadReadLock, 32 ReportTypeMutexBadReadUnlock, 33 ReportTypeSignalUnsafe, 34 ReportTypeErrnoInSignal, 35 ReportTypeDeadlock 36 }; 37 38 struct ReportStack { 39 SymbolizedStack *frames; 40 bool suppressable; 41 static ReportStack *New(); 42 43 private: 44 ReportStack(); 45 }; 46 47 struct ReportMopMutex { 48 u64 id; 49 bool write; 50 }; 51 52 struct ReportMop { 53 int tid; 54 uptr addr; 55 int size; 56 bool write; 57 bool atomic; 58 uptr external_tag; 59 Vector<ReportMopMutex> mset; 60 ReportStack *stack; 61 62 ReportMop(); 63 }; 64 65 enum ReportLocationType { 66 ReportLocationGlobal, 67 ReportLocationHeap, 68 ReportLocationStack, 69 ReportLocationTLS, 70 ReportLocationFD 71 }; 72 73 struct ReportLocation { 74 ReportLocationType type; 75 DataInfo global; 76 uptr heap_chunk_start; 77 uptr heap_chunk_size; 78 uptr external_tag; 79 int tid; 80 int fd; 81 bool suppressable; 82 ReportStack *stack; 83 84 static ReportLocation *New(ReportLocationType type); 85 private: 86 explicit ReportLocation(ReportLocationType type); 87 }; 88 89 struct ReportThread { 90 int id; 91 tid_t os_id; 92 bool running; 93 bool workerthread; 94 char *name; 95 u32 parent_tid; 96 ReportStack *stack; 97 }; 98 99 struct ReportMutex { 100 u64 id; 101 uptr addr; 102 bool destroyed; 103 ReportStack *stack; 104 }; 105 106 class ReportDesc { 107 public: 108 ReportType typ; 109 uptr tag; 110 Vector<ReportStack*> stacks; 111 Vector<ReportMop*> mops; 112 Vector<ReportLocation*> locs; 113 Vector<ReportMutex*> mutexes; 114 Vector<ReportThread*> threads; 115 Vector<int> unique_tids; 116 ReportStack *sleep; 117 int count; 118 119 ReportDesc(); 120 ~ReportDesc(); 121 122 private: 123 ReportDesc(const ReportDesc&); 124 void operator = (const ReportDesc&); 125 }; 126 127 // Format and output the report to the console/log. No additional logic. 128 void PrintReport(const ReportDesc *rep); 129 void PrintStack(const ReportStack *stack); 130 131 } // namespace __tsan 132 133 #endif // TSAN_REPORT_H 134