annotate libsanitizer/tsan/tsan_report.h @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 //===-- tsan_report.h -------------------------------------------*- C++ -*-===//
kono
parents:
diff changeset
2 //
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
111
kono
parents:
diff changeset
6 //
kono
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
kono
parents:
diff changeset
8 //
kono
parents:
diff changeset
9 // This file is a part of ThreadSanitizer (TSan), a race detector.
kono
parents:
diff changeset
10 //
kono
parents:
diff changeset
11 //===----------------------------------------------------------------------===//
kono
parents:
diff changeset
12 #ifndef TSAN_REPORT_H
kono
parents:
diff changeset
13 #define TSAN_REPORT_H
kono
parents:
diff changeset
14
kono
parents:
diff changeset
15 #include "sanitizer_common/sanitizer_symbolizer.h"
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
16 #include "sanitizer_common/sanitizer_thread_registry.h"
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
17 #include "sanitizer_common/sanitizer_vector.h"
111
kono
parents:
diff changeset
18 #include "tsan_defs.h"
kono
parents:
diff changeset
19
kono
parents:
diff changeset
20 namespace __tsan {
kono
parents:
diff changeset
21
kono
parents:
diff changeset
22 enum ReportType {
kono
parents:
diff changeset
23 ReportTypeRace,
kono
parents:
diff changeset
24 ReportTypeVptrRace,
kono
parents:
diff changeset
25 ReportTypeUseAfterFree,
kono
parents:
diff changeset
26 ReportTypeVptrUseAfterFree,
kono
parents:
diff changeset
27 ReportTypeExternalRace,
kono
parents:
diff changeset
28 ReportTypeThreadLeak,
kono
parents:
diff changeset
29 ReportTypeMutexDestroyLocked,
kono
parents:
diff changeset
30 ReportTypeMutexDoubleLock,
kono
parents:
diff changeset
31 ReportTypeMutexInvalidAccess,
kono
parents:
diff changeset
32 ReportTypeMutexBadUnlock,
kono
parents:
diff changeset
33 ReportTypeMutexBadReadLock,
kono
parents:
diff changeset
34 ReportTypeMutexBadReadUnlock,
kono
parents:
diff changeset
35 ReportTypeSignalUnsafe,
kono
parents:
diff changeset
36 ReportTypeErrnoInSignal,
kono
parents:
diff changeset
37 ReportTypeDeadlock
kono
parents:
diff changeset
38 };
kono
parents:
diff changeset
39
kono
parents:
diff changeset
40 struct ReportStack {
kono
parents:
diff changeset
41 SymbolizedStack *frames;
kono
parents:
diff changeset
42 bool suppressable;
kono
parents:
diff changeset
43 static ReportStack *New();
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 private:
kono
parents:
diff changeset
46 ReportStack();
kono
parents:
diff changeset
47 };
kono
parents:
diff changeset
48
kono
parents:
diff changeset
49 struct ReportMopMutex {
kono
parents:
diff changeset
50 u64 id;
kono
parents:
diff changeset
51 bool write;
kono
parents:
diff changeset
52 };
kono
parents:
diff changeset
53
kono
parents:
diff changeset
54 struct ReportMop {
kono
parents:
diff changeset
55 int tid;
kono
parents:
diff changeset
56 uptr addr;
kono
parents:
diff changeset
57 int size;
kono
parents:
diff changeset
58 bool write;
kono
parents:
diff changeset
59 bool atomic;
kono
parents:
diff changeset
60 uptr external_tag;
kono
parents:
diff changeset
61 Vector<ReportMopMutex> mset;
kono
parents:
diff changeset
62 ReportStack *stack;
kono
parents:
diff changeset
63
kono
parents:
diff changeset
64 ReportMop();
kono
parents:
diff changeset
65 };
kono
parents:
diff changeset
66
kono
parents:
diff changeset
67 enum ReportLocationType {
kono
parents:
diff changeset
68 ReportLocationGlobal,
kono
parents:
diff changeset
69 ReportLocationHeap,
kono
parents:
diff changeset
70 ReportLocationStack,
kono
parents:
diff changeset
71 ReportLocationTLS,
kono
parents:
diff changeset
72 ReportLocationFD
kono
parents:
diff changeset
73 };
kono
parents:
diff changeset
74
kono
parents:
diff changeset
75 struct ReportLocation {
kono
parents:
diff changeset
76 ReportLocationType type;
kono
parents:
diff changeset
77 DataInfo global;
kono
parents:
diff changeset
78 uptr heap_chunk_start;
kono
parents:
diff changeset
79 uptr heap_chunk_size;
kono
parents:
diff changeset
80 uptr external_tag;
kono
parents:
diff changeset
81 int tid;
kono
parents:
diff changeset
82 int fd;
kono
parents:
diff changeset
83 bool suppressable;
kono
parents:
diff changeset
84 ReportStack *stack;
kono
parents:
diff changeset
85
kono
parents:
diff changeset
86 static ReportLocation *New(ReportLocationType type);
kono
parents:
diff changeset
87 private:
kono
parents:
diff changeset
88 explicit ReportLocation(ReportLocationType type);
kono
parents:
diff changeset
89 };
kono
parents:
diff changeset
90
kono
parents:
diff changeset
91 struct ReportThread {
kono
parents:
diff changeset
92 int id;
kono
parents:
diff changeset
93 tid_t os_id;
kono
parents:
diff changeset
94 bool running;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
95 ThreadType thread_type;
111
kono
parents:
diff changeset
96 char *name;
kono
parents:
diff changeset
97 u32 parent_tid;
kono
parents:
diff changeset
98 ReportStack *stack;
kono
parents:
diff changeset
99 };
kono
parents:
diff changeset
100
kono
parents:
diff changeset
101 struct ReportMutex {
kono
parents:
diff changeset
102 u64 id;
kono
parents:
diff changeset
103 uptr addr;
kono
parents:
diff changeset
104 bool destroyed;
kono
parents:
diff changeset
105 ReportStack *stack;
kono
parents:
diff changeset
106 };
kono
parents:
diff changeset
107
kono
parents:
diff changeset
108 class ReportDesc {
kono
parents:
diff changeset
109 public:
kono
parents:
diff changeset
110 ReportType typ;
kono
parents:
diff changeset
111 uptr tag;
kono
parents:
diff changeset
112 Vector<ReportStack*> stacks;
kono
parents:
diff changeset
113 Vector<ReportMop*> mops;
kono
parents:
diff changeset
114 Vector<ReportLocation*> locs;
kono
parents:
diff changeset
115 Vector<ReportMutex*> mutexes;
kono
parents:
diff changeset
116 Vector<ReportThread*> threads;
kono
parents:
diff changeset
117 Vector<int> unique_tids;
kono
parents:
diff changeset
118 ReportStack *sleep;
kono
parents:
diff changeset
119 int count;
kono
parents:
diff changeset
120
kono
parents:
diff changeset
121 ReportDesc();
kono
parents:
diff changeset
122 ~ReportDesc();
kono
parents:
diff changeset
123
kono
parents:
diff changeset
124 private:
kono
parents:
diff changeset
125 ReportDesc(const ReportDesc&);
kono
parents:
diff changeset
126 void operator = (const ReportDesc&);
kono
parents:
diff changeset
127 };
kono
parents:
diff changeset
128
kono
parents:
diff changeset
129 // Format and output the report to the console/log. No additional logic.
kono
parents:
diff changeset
130 void PrintReport(const ReportDesc *rep);
kono
parents:
diff changeset
131 void PrintStack(const ReportStack *stack);
kono
parents:
diff changeset
132
kono
parents:
diff changeset
133 } // namespace __tsan
kono
parents:
diff changeset
134
kono
parents:
diff changeset
135 #endif // TSAN_REPORT_H