Skip to content

Commit ac855d3

Browse files
committedJan 16, 2019
[TSan] Use switches when dealing with enums
Summary: Small refactoring: replace some if-else cascades with switches so that the compiler warns us about missing cases. Maybe found a small bug? Reviewers: dcoughlin, kubamracek, dvyukov, delcypher, jfb Reviewed By: dvyukov Subscribers: llvm-commits, #sanitizers Tags: #sanitizers Differential Revision: https://reviews.llvm.org/D56295 llvm-svn: 351288
1 parent 6320efb commit ac855d3

File tree

3 files changed

+87
-86
lines changed

3 files changed

+87
-86
lines changed
 

‎compiler-rt/lib/tsan/rtl/tsan_debugging.cc

+28-22
Original file line numberDiff line numberDiff line change
@@ -20,31 +20,37 @@
2020
using namespace __tsan;
2121

2222
static const char *ReportTypeDescription(ReportType typ) {
23-
if (typ == ReportTypeRace) return "data-race";
24-
if (typ == ReportTypeVptrRace) return "data-race-vptr";
25-
if (typ == ReportTypeUseAfterFree) return "heap-use-after-free";
26-
if (typ == ReportTypeVptrUseAfterFree) return "heap-use-after-free-vptr";
27-
if (typ == ReportTypeExternalRace) return "external-race";
28-
if (typ == ReportTypeThreadLeak) return "thread-leak";
29-
if (typ == ReportTypeMutexDestroyLocked) return "locked-mutex-destroy";
30-
if (typ == ReportTypeMutexDoubleLock) return "mutex-double-lock";
31-
if (typ == ReportTypeMutexInvalidAccess) return "mutex-invalid-access";
32-
if (typ == ReportTypeMutexBadUnlock) return "mutex-bad-unlock";
33-
if (typ == ReportTypeMutexBadReadLock) return "mutex-bad-read-lock";
34-
if (typ == ReportTypeMutexBadReadUnlock) return "mutex-bad-read-unlock";
35-
if (typ == ReportTypeSignalUnsafe) return "signal-unsafe-call";
36-
if (typ == ReportTypeErrnoInSignal) return "errno-in-signal-handler";
37-
if (typ == ReportTypeDeadlock) return "lock-order-inversion";
38-
return "";
23+
switch (typ) {
24+
case ReportTypeRace: return "data-race";
25+
case ReportTypeVptrRace: return "data-race-vptr";
26+
case ReportTypeUseAfterFree: return "heap-use-after-free";
27+
case ReportTypeVptrUseAfterFree: return "heap-use-after-free-vptr";
28+
case ReportTypeExternalRace: return "external-race";
29+
case ReportTypeThreadLeak: return "thread-leak";
30+
case ReportTypeMutexDestroyLocked: return "locked-mutex-destroy";
31+
case ReportTypeMutexDoubleLock: return "mutex-double-lock";
32+
case ReportTypeMutexInvalidAccess: return "mutex-invalid-access";
33+
case ReportTypeMutexBadUnlock: return "mutex-bad-unlock";
34+
case ReportTypeMutexBadReadLock: return "mutex-bad-read-lock";
35+
case ReportTypeMutexBadReadUnlock: return "mutex-bad-read-unlock";
36+
case ReportTypeSignalUnsafe: return "signal-unsafe-call";
37+
case ReportTypeErrnoInSignal: return "errno-in-signal-handler";
38+
case ReportTypeDeadlock: return "lock-order-inversion";
39+
// No default case so compiler warns us if we miss one
40+
}
41+
UNREACHABLE("missing case");
3942
}
4043

4144
static const char *ReportLocationTypeDescription(ReportLocationType typ) {
42-
if (typ == ReportLocationGlobal) return "global";
43-
if (typ == ReportLocationHeap) return "heap";
44-
if (typ == ReportLocationStack) return "stack";
45-
if (typ == ReportLocationTLS) return "tls";
46-
if (typ == ReportLocationFD) return "fd";
47-
return "";
45+
switch (typ) {
46+
case ReportLocationGlobal: return "global";
47+
case ReportLocationHeap: return "heap";
48+
case ReportLocationStack: return "stack";
49+
case ReportLocationTLS: return "tls";
50+
case ReportLocationFD: return "fd";
51+
// No default case so compiler warns us if we miss one
52+
}
53+
UNREACHABLE("missing case");
4854
}
4955

5056
static void CopyTrace(SymbolizedStack *first_frame, void **trace,

‎compiler-rt/lib/tsan/rtl/tsan_report.cc

+35-32
Original file line numberDiff line numberDiff line change
@@ -77,39 +77,42 @@ const char *thread_name(char *buf, int tid) {
7777
}
7878

7979
static const char *ReportTypeString(ReportType typ, uptr tag) {
80-
if (typ == ReportTypeRace)
81-
return "data race";
82-
if (typ == ReportTypeVptrRace)
83-
return "data race on vptr (ctor/dtor vs virtual call)";
84-
if (typ == ReportTypeUseAfterFree)
85-
return "heap-use-after-free";
86-
if (typ == ReportTypeVptrUseAfterFree)
87-
return "heap-use-after-free (virtual call vs free)";
88-
if (typ == ReportTypeExternalRace) {
89-
const char *str = GetReportHeaderFromTag(tag);
90-
return str ? str : "race on external object";
80+
switch (typ) {
81+
case ReportTypeRace:
82+
return "data race";
83+
case ReportTypeVptrRace:
84+
return "data race on vptr (ctor/dtor vs virtual call)";
85+
case ReportTypeUseAfterFree:
86+
return "heap-use-after-free";
87+
case ReportTypeVptrUseAfterFree:
88+
return "heap-use-after-free (virtual call vs free)";
89+
case ReportTypeExternalRace: {
90+
const char *str = GetReportHeaderFromTag(tag);
91+
return str ? str : "race on external object";
92+
}
93+
case ReportTypeThreadLeak:
94+
return "thread leak";
95+
case ReportTypeMutexDestroyLocked:
96+
return "destroy of a locked mutex";
97+
case ReportTypeMutexDoubleLock:
98+
return "double lock of a mutex";
99+
case ReportTypeMutexInvalidAccess:
100+
return "use of an invalid mutex (e.g. uninitialized or destroyed)";
101+
case ReportTypeMutexBadUnlock:
102+
return "unlock of an unlocked mutex (or by a wrong thread)";
103+
case ReportTypeMutexBadReadLock:
104+
return "read lock of a write locked mutex";
105+
case ReportTypeMutexBadReadUnlock:
106+
return "read unlock of a write locked mutex";
107+
case ReportTypeSignalUnsafe:
108+
return "signal-unsafe call inside of a signal";
109+
case ReportTypeErrnoInSignal:
110+
return "signal handler spoils errno";
111+
case ReportTypeDeadlock:
112+
return "lock-order-inversion (potential deadlock)";
113+
// No default case so compiler warns us if we miss one
91114
}
92-
if (typ == ReportTypeThreadLeak)
93-
return "thread leak";
94-
if (typ == ReportTypeMutexDestroyLocked)
95-
return "destroy of a locked mutex";
96-
if (typ == ReportTypeMutexDoubleLock)
97-
return "double lock of a mutex";
98-
if (typ == ReportTypeMutexInvalidAccess)
99-
return "use of an invalid mutex (e.g. uninitialized or destroyed)";
100-
if (typ == ReportTypeMutexBadUnlock)
101-
return "unlock of an unlocked mutex (or by a wrong thread)";
102-
if (typ == ReportTypeMutexBadReadLock)
103-
return "read lock of a write locked mutex";
104-
if (typ == ReportTypeMutexBadReadUnlock)
105-
return "read unlock of a write locked mutex";
106-
if (typ == ReportTypeSignalUnsafe)
107-
return "signal-unsafe call inside of a signal";
108-
if (typ == ReportTypeErrnoInSignal)
109-
return "signal handler spoils errno";
110-
if (typ == ReportTypeDeadlock)
111-
return "lock-order-inversion (potential deadlock)";
112-
return "";
115+
UNREACHABLE("missing case");
113116
}
114117

115118
#if SANITIZER_MAC

‎compiler-rt/lib/tsan/rtl/tsan_suppressions.cc

+24-32
Original file line numberDiff line numberDiff line change
@@ -66,38 +66,30 @@ SuppressionContext *Suppressions() {
6666
}
6767

6868
static const char *conv(ReportType typ) {
69-
if (typ == ReportTypeRace)
70-
return kSuppressionRace;
71-
else if (typ == ReportTypeVptrRace)
72-
return kSuppressionRace;
73-
else if (typ == ReportTypeUseAfterFree)
74-
return kSuppressionRace;
75-
else if (typ == ReportTypeVptrUseAfterFree)
76-
return kSuppressionRace;
77-
else if (typ == ReportTypeExternalRace)
78-
return kSuppressionRace;
79-
else if (typ == ReportTypeThreadLeak)
80-
return kSuppressionThread;
81-
else if (typ == ReportTypeMutexDestroyLocked)
82-
return kSuppressionMutex;
83-
else if (typ == ReportTypeMutexDoubleLock)
84-
return kSuppressionMutex;
85-
else if (typ == ReportTypeMutexInvalidAccess)
86-
return kSuppressionMutex;
87-
else if (typ == ReportTypeMutexBadUnlock)
88-
return kSuppressionMutex;
89-
else if (typ == ReportTypeMutexBadReadLock)
90-
return kSuppressionMutex;
91-
else if (typ == ReportTypeMutexBadReadUnlock)
92-
return kSuppressionMutex;
93-
else if (typ == ReportTypeSignalUnsafe)
94-
return kSuppressionSignal;
95-
else if (typ == ReportTypeErrnoInSignal)
96-
return kSuppressionNone;
97-
else if (typ == ReportTypeDeadlock)
98-
return kSuppressionDeadlock;
99-
Printf("ThreadSanitizer: unknown report type %d\n", typ);
100-
Die();
69+
switch (typ) {
70+
case ReportTypeRace:
71+
case ReportTypeVptrRace:
72+
case ReportTypeUseAfterFree:
73+
case ReportTypeVptrUseAfterFree:
74+
case ReportTypeExternalRace:
75+
return kSuppressionRace;
76+
case ReportTypeThreadLeak:
77+
return kSuppressionThread;
78+
case ReportTypeMutexDestroyLocked:
79+
case ReportTypeMutexDoubleLock:
80+
case ReportTypeMutexInvalidAccess:
81+
case ReportTypeMutexBadUnlock:
82+
case ReportTypeMutexBadReadLock:
83+
case ReportTypeMutexBadReadUnlock:
84+
return kSuppressionMutex;
85+
case ReportTypeSignalUnsafe:
86+
case ReportTypeErrnoInSignal:
87+
return kSuppressionSignal;
88+
case ReportTypeDeadlock:
89+
return kSuppressionDeadlock;
90+
// No default case so compiler warns us if we miss one
91+
}
92+
UNREACHABLE("missing case");
10193
}
10294

10395
static uptr IsSuppressed(const char *stype, const AddressInfo &info,

0 commit comments

Comments
 (0)
Please sign in to comment.