123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- //===-- tsan_report.h -------------------------------------------*- C++ -*-===//
- //
- // This file is distributed under the University of Illinois Open Source
- // License. See LICENSE.TXT for details.
- //
- //===----------------------------------------------------------------------===//
- //
- // This file is a part of ThreadSanitizer (TSan), a race detector.
- //
- //===----------------------------------------------------------------------===//
- #ifndef TSAN_REPORT_H
- #define TSAN_REPORT_H
- #include "sanitizer_common/sanitizer_symbolizer.h"
- #include "tsan_defs.h"
- #include "tsan_vector.h"
- namespace __tsan {
- enum ReportType {
- ReportTypeRace,
- ReportTypeVptrRace,
- ReportTypeUseAfterFree,
- ReportTypeVptrUseAfterFree,
- ReportTypeThreadLeak,
- ReportTypeMutexDestroyLocked,
- ReportTypeMutexDoubleLock,
- ReportTypeMutexBadUnlock,
- ReportTypeMutexBadReadLock,
- ReportTypeMutexBadReadUnlock,
- ReportTypeSignalUnsafe,
- ReportTypeErrnoInSignal,
- ReportTypeDeadlock
- };
- struct ReportStack {
- ReportStack *next;
- AddressInfo info;
- bool suppressable;
- static ReportStack *New(uptr addr);
- private:
- ReportStack();
- };
- struct ReportMopMutex {
- u64 id;
- bool write;
- };
- struct ReportMop {
- int tid;
- uptr addr;
- int size;
- bool write;
- bool atomic;
- Vector<ReportMopMutex> mset;
- ReportStack *stack;
- ReportMop();
- };
- enum ReportLocationType {
- ReportLocationGlobal,
- ReportLocationHeap,
- ReportLocationStack,
- ReportLocationTLS,
- ReportLocationFD
- };
- struct ReportLocation {
- ReportLocationType type;
- DataInfo global;
- uptr heap_chunk_start;
- uptr heap_chunk_size;
- int tid;
- int fd;
- bool suppressable;
- ReportStack *stack;
- static ReportLocation *New(ReportLocationType type);
- private:
- explicit ReportLocation(ReportLocationType type);
- };
- struct ReportThread {
- int id;
- uptr pid;
- bool running;
- char *name;
- int parent_tid;
- ReportStack *stack;
- };
- struct ReportMutex {
- u64 id;
- uptr addr;
- bool destroyed;
- ReportStack *stack;
- };
- class ReportDesc {
- public:
- ReportType typ;
- Vector<ReportStack*> stacks;
- Vector<ReportMop*> mops;
- Vector<ReportLocation*> locs;
- Vector<ReportMutex*> mutexes;
- Vector<ReportThread*> threads;
- Vector<int> unique_tids;
- ReportStack *sleep;
- int count;
- ReportDesc();
- ~ReportDesc();
- private:
- ReportDesc(const ReportDesc&);
- void operator = (const ReportDesc&);
- };
- // Format and output the report to the console/log. No additional logic.
- void PrintReport(const ReportDesc *rep);
- void PrintStack(const ReportStack *stack);
- } // namespace __tsan
- #endif // TSAN_REPORT_H
|