]> granicus.if.org Git - clang/commitdiff
[analyzer] Fix an bug where statically linked, but not registered checkers weren...
authorKristof Umann <dkszelethus@gmail.com>
Sat, 26 Jan 2019 17:27:40 +0000 (17:27 +0000)
committerKristof Umann <dkszelethus@gmail.com>
Sat, 26 Jan 2019 17:27:40 +0000 (17:27 +0000)
My last patch, D56989, moved the validation of whether a checker exists into
its constructor, but we do support statically linked (and non-plugin) checkers
that were do not have an entry in Checkers.td. However, the handling of this
happens after the creation of the CheckerRegistry object.

This patch fixes this bug by moving even this functionality into
CheckerRegistry's constructor.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@352284 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/StaticAnalyzer/Frontend/CheckerRegistry.h
lib/StaticAnalyzer/Frontend/CheckerRegistration.cpp
lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp

index a69dca3be0e8651144d1b6b96c2ad48a386eb9c7..8424564028ad0e2e7922f4fa32a468c4be5d44a8 100644 (file)
@@ -81,8 +81,11 @@ namespace ento {
 /// "core.builtin", or the full name "core.builtin.NoReturnFunctionChecker".
 class CheckerRegistry {
 public:
-  CheckerRegistry(ArrayRef<std::string> plugins, DiagnosticsEngine &diags,
-                  AnalyzerOptions &AnOpts, const LangOptions &LangOpts);
+  CheckerRegistry(
+      ArrayRef<std::string> plugins, DiagnosticsEngine &diags,
+      AnalyzerOptions &AnOpts, const LangOptions &LangOpts,
+      ArrayRef<std::function<void(CheckerRegistry &)>>
+          checkerRegistrationFns = {});
 
   /// Initialization functions perform any necessary setup for a checker.
   /// They should include a call to CheckerManager::registerChecker.
index fbf9e5b00db2821e9f4fcb34a18265b76938a054..58f81b4ffb464f38151c1122136ec63c2b751c2d 100644 (file)
@@ -33,10 +33,8 @@ std::unique_ptr<CheckerManager> ento::createCheckerManager(
     DiagnosticsEngine &diags) {
   auto checkerMgr = llvm::make_unique<CheckerManager>(context, opts);
 
-  CheckerRegistry allCheckers(plugins, diags, opts, context.getLangOpts());
-
-  for (const auto &Fn : checkerRegistrationFns)
-    Fn(allCheckers);
+  CheckerRegistry allCheckers(plugins, diags, opts, context.getLangOpts(),
+                              checkerRegistrationFns);
 
   allCheckers.initializeManager(*checkerMgr);
   allCheckers.validateCheckerOptions();
index 08633ce740e85789753181a98cc264af8abbac96..8850b2895c9990186fcf598e2c3b6d6a15cc2029 100644 (file)
@@ -91,10 +91,11 @@ CheckerRegistry::getMutableCheckersForCmdLineArg(StringRef CmdLineArg) {
   return { it, it + size };
 }
 
-CheckerRegistry::CheckerRegistry(ArrayRef<std::string> plugins,
-                                 DiagnosticsEngine &diags,
-                                 AnalyzerOptions &AnOpts,
-                                 const LangOptions &LangOpts)
+CheckerRegistry::CheckerRegistry(
+     ArrayRef<std::string> plugins, DiagnosticsEngine &diags,
+     AnalyzerOptions &AnOpts, const LangOptions &LangOpts,
+     ArrayRef<std::function<void(CheckerRegistry &)>>
+         checkerRegistrationFns)
   : Diags(diags), AnOpts(AnOpts), LangOpts(LangOpts) {
 
   // Register builtin checkers.
@@ -137,6 +138,13 @@ CheckerRegistry::CheckerRegistry(ArrayRef<std::string> plugins,
       registerPluginCheckers(*this);
   }
 
+  // Register statically linked checkers, that aren't generated from the tblgen
+  // file, but rather passed their registry function as a parameter in 
+  // checkerRegistrationFns. 
+
+  for (const auto &Fn : checkerRegistrationFns)
+    Fn(*this);
+
   // Sort checkers for efficient collection.
   // FIXME: Alphabetical sort puts 'experimental' in the middle.
   // Would it be better to name it '~experimental' or something else