Skip to content

Commit 13f4a30

Browse files
committed
Use registration function name fragment as checker family debug name
This fragment is often the same as the class name.
1 parent 4becdeb commit 13f4a30

File tree

6 files changed

+40
-15
lines changed

6 files changed

+40
-15
lines changed

clang/include/clang/StaticAnalyzer/Core/Checker.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -551,7 +551,8 @@ class CheckerFamily : public CheckerBackend, public CHECKs... {
551551
public:
552552
template <typename CHECKER>
553553
static void _register(CHECKER *Chk, CheckerManager &Mgr) {
554-
Chk->CheckerBackendName = Mgr.getCurrentCheckerName();
554+
if (Chk->getDebugName().empty())
555+
Chk->CheckerBackendName = Mgr.getCurrentCheckerDebugName();
555556
(CHECKs::_register(Chk, Mgr), ...);
556557
}
557558

clang/include/clang/StaticAnalyzer/Core/CheckerManager.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ class CheckerManager {
129129
const AnalyzerOptions &AOptions;
130130
const Preprocessor *PP = nullptr;
131131
CheckerNameRef CurrentCheckerName;
132+
CheckerNameRef CurrentCheckerDebugName;
132133
DiagnosticsEngine &Diags;
133134
std::unique_ptr<CheckerRegistryData> RegistryData;
134135

@@ -159,9 +160,16 @@ class CheckerManager {
159160

160161
~CheckerManager();
161162

162-
void setCurrentCheckerName(CheckerNameRef name) { CurrentCheckerName = name; }
163+
void setCurrentCheckerName(CheckerNameRef Name) { CurrentCheckerName = Name; }
163164
CheckerNameRef getCurrentCheckerName() const { return CurrentCheckerName; }
164165

166+
void setCurrentCheckerDebugName(CheckerNameRef Name) {
167+
CurrentCheckerDebugName = Name;
168+
}
169+
CheckerNameRef getCurrentCheckerDebugName() const {
170+
return CurrentCheckerDebugName;
171+
}
172+
165173
bool hasPathSensitiveCheckers() const;
166174

167175
const LangOptions &getLangOpts() const { return LangOpts; }

clang/include/clang/StaticAnalyzer/Core/CheckerRegistryData.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ struct CheckerInfo {
104104
RegisterCheckerFn Initialize = nullptr;
105105
ShouldRegisterFunction ShouldRegister = nullptr;
106106
StringRef FullName;
107+
StringRef DebugName;
107108
StringRef Desc;
108109
StringRef DocumentationUri;
109110
CmdLineOptionList CmdLineOptions;
@@ -128,9 +129,9 @@ struct CheckerInfo {
128129
}
129130

130131
CheckerInfo(RegisterCheckerFn Fn, ShouldRegisterFunction sfn, StringRef Name,
131-
StringRef Desc, StringRef DocsUri, bool IsHidden)
132-
: Initialize(Fn), ShouldRegister(sfn), FullName(Name), Desc(Desc),
133-
DocumentationUri(DocsUri), IsHidden(IsHidden) {}
132+
StringRef DName, StringRef Desc, StringRef DocsUri, bool IsHidden)
133+
: Initialize(Fn), ShouldRegister(sfn), FullName(Name), DebugName(DName),
134+
Desc(Desc), DocumentationUri(DocsUri), IsHidden(IsHidden) {}
134135

135136
// Used for lower_bound.
136137
explicit CheckerInfo(StringRef FullName) : FullName(FullName) {}

clang/include/clang/StaticAnalyzer/Frontend/CheckerRegistry.h

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@
5050
// checker.
5151
//
5252
// The clang_registerCheckers function may add any number of checkers to the
53-
// registry. If any checkers require additional initialization, use the three-
54-
// argument form of CheckerRegistry::addChecker.
53+
// registry. If any checkers require additional initialization, use the
54+
// non-templated form of CheckerRegistry::addChecker.
5555
//
5656
// To load a checker plugin, specify the full path to the dynamic library as
5757
// the argument to the -load option in the cc1 frontend. You can then enable
@@ -115,9 +115,22 @@ class CheckerRegistry {
115115
public:
116116
/// Adds a checker to the registry. Use this non-templated overload when your
117117
/// checker requires custom initialization.
118-
void addChecker(RegisterCheckerFn Fn, ShouldRegisterFunction sfn,
118+
void addChecker(RegisterCheckerFn Fn, ShouldRegisterFunction Sfn,
119+
StringRef FullName, StringRef DebugName, StringRef Desc,
120+
StringRef DocsUri, bool IsHidden);
121+
122+
/// Adds a checker to the registry. This overload doesn't take a `DebugName`
123+
/// (which usually looks like `DivZeroChecker`), so it uses the user-facing
124+
/// `FullName` (which usually looks like ``core.DivideZero`) as a debug name.
125+
/// THIS IS DEPRECATED and is only provided to preserve compatibility with
126+
/// legacy plugins.
127+
/// TODO: Eventually remove this from the codebase.
128+
void addChecker(RegisterCheckerFn Fn, ShouldRegisterFunction Sfn,
119129
StringRef FullName, StringRef Desc, StringRef DocsUri,
120-
bool IsHidden);
130+
bool IsHidden) {
131+
addChecker(Fn, Sfn, FullName, /*DebugName =*/FullName, Desc, DocsUri,
132+
IsHidden);
133+
}
121134

122135
/// Adds a checker to the registry. Use this templated overload when your
123136
/// checker does not require any custom initialization.

clang/lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ CheckerRegistry::CheckerRegistry(
5656
// Register builtin checkers.
5757
#define GET_CHECKERS
5858
#define CHECKER(FULLNAME, CLASS, HELPTEXT, DOC_URI, IS_HIDDEN) \
59-
addChecker(register##CLASS, shouldRegister##CLASS, FULLNAME, HELPTEXT, \
60-
DOC_URI, IS_HIDDEN);
59+
addChecker(register##CLASS, shouldRegister##CLASS, FULLNAME, #CLASS, \
60+
HELPTEXT, DOC_URI, IS_HIDDEN);
6161

6262
#define GET_PACKAGES
6363
#define PACKAGE(FULLNAME) addPackage(FULLNAME);
@@ -433,9 +433,10 @@ void CheckerRegistry::addPackageOption(StringRef OptionType,
433433

434434
void CheckerRegistry::addChecker(RegisterCheckerFn Rfn,
435435
ShouldRegisterFunction Sfn, StringRef Name,
436-
StringRef Desc, StringRef DocsUri,
437-
bool IsHidden) {
438-
Data.Checkers.emplace_back(Rfn, Sfn, Name, Desc, DocsUri, IsHidden);
436+
StringRef DebugName, StringRef Desc,
437+
StringRef DocsUri, bool IsHidden) {
438+
Data.Checkers.emplace_back(Rfn, Sfn, Name, DebugName, Desc, DocsUri,
439+
IsHidden);
439440

440441
// Record the presence of the checker in its packages.
441442
StringRef PackageName, LeafName;
@@ -462,6 +463,7 @@ void CheckerRegistry::initializeManager(CheckerManager &CheckerMgr) const {
462463
// Initialize the CheckerManager with all enabled checkers.
463464
for (const auto *Checker : Data.EnabledCheckers) {
464465
CheckerMgr.setCurrentCheckerName(CheckerNameRef(Checker->FullName));
466+
CheckerMgr.setCurrentCheckerDebugName(CheckerNameRef(Checker->DebugName));
465467
Checker->Initialize(CheckerMgr);
466468
}
467469
}

clang/test/Analysis/ftime-trace.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939

4040
// Finally, each checker call back is also present:
4141
//
42-
// CHECK: "name": "Total Stmt:core.DivideZero",
42+
// CHECK: "name": "Total Stmt:DivZeroChecker",
4343
// CHECK-NEXT: "args": {
4444
// CHECK-NEXT: "count": {{[0-9]+}},
4545
// CHECK-NEXT: "avg ms": {{[0-9]+}}

0 commit comments

Comments
 (0)