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 18namespace __tsan { 19 20enum 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 38struct ReportStack { 39 SymbolizedStack *frames; 40 bool suppressable; 41 static ReportStack *New(); 42 43 private: 44 ReportStack(); 45}; 46 47struct ReportMopMutex { 48 u64 id; 49 bool write; 50}; 51 52struct 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 65enum ReportLocationType { 66 ReportLocationGlobal, 67 ReportLocationHeap, 68 ReportLocationStack, 69 ReportLocationTLS, 70 ReportLocationFD 71}; 72 73struct 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 89struct 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 99struct ReportMutex { 100 u64 id; 101 uptr addr; 102 bool destroyed; 103 ReportStack *stack; 104}; 105 106class 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. 128void PrintReport(const ReportDesc *rep); 129void PrintStack(const ReportStack *stack); 130 131} // namespace __tsan 132 133#endif // TSAN_REPORT_H 134