Author: Adam Balogh Date: 2020-03-19T16:06:42+01:00 New Revision: 6cff2e9f7884690d480b961f78806cbb91773b34
URL: https://github.com/llvm/llvm-project/commit/6cff2e9f7884690d480b961f78806cbb91773b34 DIFF: https://github.com/llvm/llvm-project/commit/6cff2e9f7884690d480b961f78806cbb91773b34.diff LOG: [Analyzer] Bugfix for CheckerRegistry `CheckerRegistry` registers a checker either if it is excplicitly enabled or it is a dependency of an explicitly enabled checker and is not explicitly disabled. In both cases it is also important that the checker should be registered (`shoudRegister`//XXX//`()` returns true). Currently there is a bug here: if the dependenct checker is not explicitly disabled it is registered regardless of whether it should be registered. This patch fixes this bug. Differential Revision: https://reviews.llvm.org/D75842 Added: Modified: clang/include/clang/StaticAnalyzer/Frontend/CheckerRegistry.h clang/unittests/StaticAnalyzer/RegisterCustomCheckersTest.cpp Removed: ################################################################################ diff --git a/clang/include/clang/StaticAnalyzer/Frontend/CheckerRegistry.h b/clang/include/clang/StaticAnalyzer/Frontend/CheckerRegistry.h index 8f0c7edc58b4..8830542f27d8 100644 --- a/clang/include/clang/StaticAnalyzer/Frontend/CheckerRegistry.h +++ b/clang/include/clang/StaticAnalyzer/Frontend/CheckerRegistry.h @@ -167,7 +167,7 @@ class CheckerRegistry { } bool isDisabled(const LangOptions &LO) const { - return State == StateFromCmdLine::State_Disabled && ShouldRegister(LO); + return State == StateFromCmdLine::State_Disabled || !ShouldRegister(LO); } // Since each checker must have a diff erent full name, we can identify diff --git a/clang/unittests/StaticAnalyzer/RegisterCustomCheckersTest.cpp b/clang/unittests/StaticAnalyzer/RegisterCustomCheckersTest.cpp index d0cf291eb2b8..8027d3338b69 100644 --- a/clang/unittests/StaticAnalyzer/RegisterCustomCheckersTest.cpp +++ b/clang/unittests/StaticAnalyzer/RegisterCustomCheckersTest.cpp @@ -81,6 +81,66 @@ TEST(RegisterCustomCheckers, CheckLocationIncDec) { runCheckerOnCode<addLocIncDecChecker>("void f() { int *p; (*p)++; }")); } +//===----------------------------------------------------------------------===// +// Unsatisfied checker dependency +//===----------------------------------------------------------------------===// + +class PrerequisiteChecker : public Checker<check::ASTCodeBody> { +public: + void checkASTCodeBody(const Decl *D, AnalysisManager &Mgr, + BugReporter &BR) const { + BR.EmitBasicReport(D, this, "Prerequisite", categories::LogicError, + "This is the prerequisite checker", + PathDiagnosticLocation(D, Mgr.getSourceManager()), {}); + } +}; + +void registerPrerequisiteChecker(CheckerManager &mgr) { + mgr.registerChecker<PrerequisiteChecker>(); +} + +bool shouldRegisterPrerequisiteChecker(const LangOptions &LO) { + return false; +} + +class DependentChecker : public Checker<check::ASTCodeBody> { +public: + void checkASTCodeBody(const Decl *D, AnalysisManager &Mgr, + BugReporter &BR) const { + BR.EmitBasicReport(D, this, "Dependent", categories::LogicError, + "This is the Dependent Checker", + PathDiagnosticLocation(D, Mgr.getSourceManager()), {}); + } +}; + +void registerDependentChecker(CheckerManager &mgr) { + mgr.registerChecker<DependentChecker>(); +} + +bool shouldRegisterDependentChecker(const LangOptions &LO) { + return true; +} + +void addDependentChecker(AnalysisASTConsumer &AnalysisConsumer, + AnalyzerOptions &AnOpts) { + AnOpts.CheckersAndPackages = {{"custom.Dependent", true}}; + AnalysisConsumer.AddCheckerRegistrationFn([](CheckerRegistry &Registry) { + Registry.addChecker(registerPrerequisiteChecker, + shouldRegisterPrerequisiteChecker, + "custom.Prerequisite", "Description", "", false); + Registry.addChecker(registerDependentChecker, + shouldRegisterDependentChecker, + "custom.Dependent", "Description", "", false); + Registry.addDependency("custom.Dependent", "custom.Prerequisite"); + }); +} + +TEST(RegisterDependentCheckers, RegisterChecker) { + std::string Diags; + EXPECT_TRUE(runCheckerOnCode<addDependentChecker>("void f() {;}", Diags)); + EXPECT_EQ(Diags, ""); +} + } // namespace } // namespace ento } // namespace clang _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits