[analyzer] Use the new registration mechanism on some of the internal checks. These...
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Tue, 15 Feb 2011 07:42:33 +0000 (07:42 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Tue, 15 Feb 2011 07:42:33 +0000 (07:42 +0000)
StackAddrLeakChecker
ObjCAtSyncChecker
UnixAPIChecker
MacOSXAPIChecker

The rest have/create implicit dependencies between checkers and need to be handled differently.

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

15 files changed:
lib/Driver/Tools.cpp
lib/StaticAnalyzer/Checkers/Checkers.td
lib/StaticAnalyzer/Checkers/ClangSACheckers.h
lib/StaticAnalyzer/Checkers/ExprEngine.cpp
lib/StaticAnalyzer/Checkers/InternalChecks.h
lib/StaticAnalyzer/Checkers/MacOSXAPIChecker.cpp
lib/StaticAnalyzer/Checkers/ObjCAtSyncChecker.cpp
lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp
lib/StaticAnalyzer/Checkers/StackAddrLeakChecker.cpp
lib/StaticAnalyzer/Checkers/UnixAPIChecker.cpp
lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
test/Analysis/misc-ps.m
test/Analysis/stack-addr-ps.c
test/Analysis/stackaddrleak.c
test/Analysis/unix-fns.c

index 01bcc3fab19a7086420d9a76c605bd8985416f1b..5b0a8887194e542ef999e12b91b440b48bb15ca5 100644 (file)
@@ -921,6 +921,13 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
       types::ID InputType = Inputs[0].getType();
 
       // Checks to perform for all language types.
+
+      CmdArgs.push_back("-analyzer-checker=core");
+      if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
+        CmdArgs.push_back("-analyzer-checker=unix");
+      if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
+        CmdArgs.push_back("-analyzer-checker=macosx");
+
       CmdArgs.push_back("-analyzer-check-dead-stores");
 
       // Checks to perform for Objective-C/Objective-C++.
index 2a2f3eed0c29f6418ca4e86fc7a787599f9a7b9d..21018af82883eddc6669f1261cde14842224a071 100644 (file)
@@ -9,10 +9,39 @@
 
 include "clang/StaticAnalyzer/Checkers/CheckerBase.td"
 
+def Core : Package<"core">;
 def Cocoa : Package<"cocoa">;
+def Unix : Package<"unix">;
+def MacOSX : Package<"macosx">;
+
+let ParentPackage = Cocoa in {
 
 def : Checker<"ObjCSelfInitChecker">,
-  InPackage<Cocoa>,
   Named<"SelfInit">,
   HelpText<"Check that 'self' is propely initialized inside an initializer method">,
   DescFile<"ObjCSelfInitChecker.cpp">;
+
+def : Checker<"ObjCAtSyncChecker">,
+  Named<"AtSync">,
+  HelpText<"Check for null pointers used as mutexes for @synchronized">,
+  DescFile<"ObjCAtSyncChecker.cpp">;
+
+}
+
+def : Checker<"StackAddrLeakChecker">,
+  InPackage<Core>,
+  Named<"StackAddrLeak">,
+  HelpText<"Check that addresses to stack memory are not leaked outside the function">,
+  DescFile<"StackAddrLeakChecker.cpp">;
+
+def : Checker<"UnixAPIChecker">,
+  InPackage<Unix>,
+  Named<"API">,
+  HelpText<"Check calls to various UNIX/Posix functions">,
+  DescFile<"UnixAPIChecker.cpp">;
+
+def : Checker<"MacOSXAPIChecker">,
+  InPackage<MacOSX>,
+  Named<"API">,
+  HelpText<"Check calls to various MacOSXAPIChecker">,
+  DescFile<"MacOSXAPIChecker.cpp">;
index b01b0f4c5442399c9175c178e3a882e5e93aece6..51cad5bc83ebdc05c7e16e352d84736d2c3c639c 100644 (file)
@@ -23,7 +23,7 @@ class ExprEngine;
 #define GET_CHECKERS
 #define CHECKER(FULLNAME,CLASS,CXXFILE,HELPTEXT,HIDDEN)    \
   void register##CLASS(ExprEngine &Eng);
-#include "Checkers.inc"
+#include "../Checkers/Checkers.inc"
 #undef CHECKER
 #undef GET_CHECKERS
 
index 26523d368b2455a146693f4f4230df926c6f7159..bde7c4395a7e67debaf278a833720bd8b2aa78c0 100644 (file)
@@ -308,15 +308,11 @@ static void RegisterInternalChecks(ExprEngine &Eng) {
   RegisterUndefBranchChecker(Eng);
   RegisterUndefCapturedBlockVarChecker(Eng);
   RegisterUndefResultChecker(Eng);
-  RegisterStackAddrLeakChecker(Eng);
-  RegisterObjCAtSyncChecker(Eng);
 
   // This is not a checker yet.
   RegisterNoReturnFunctionChecker(Eng);
   RegisterBuiltinFunctionChecker(Eng);
   RegisterOSAtomicChecker(Eng);
-  RegisterUnixAPIChecker(Eng);
-  RegisterMacOSXAPIChecker(Eng);
 }
 
 ExprEngine::ExprEngine(AnalysisManager &mgr, TransferFuncs *tf)
@@ -333,13 +329,14 @@ ExprEngine::ExprEngine(AnalysisManager &mgr, TransferFuncs *tf)
     NSExceptionII(NULL), NSExceptionInstanceRaiseSelectors(NULL),
     RaiseSel(GetNullarySelector("raise", getContext())),
     BR(mgr, *this), TF(tf) {
-  mgr.getCheckerManager()->registerCheckersToEngine(*this);
   // Register internal checks.
   RegisterInternalChecks(*this);
 
   // FIXME: Eventually remove the TF object entirely.
   TF->RegisterChecks(*this);
   TF->RegisterPrinters(getStateManager().Printers);
+
+  mgr.getCheckerManager()->registerCheckersToEngine(*this);
   
   if (mgr.shouldEagerlyTrimExplodedGraph()) {
     // Enable eager node reclaimation when constructing the ExplodedGraph.  
index 4965fefd90c311ac4bd4a60dda5e4e2b2fa6ad14..4eccf6600080ffae7b56ce30380ac50cffbdd622 100644 (file)
@@ -34,24 +34,19 @@ void RegisterDereferenceChecker(ExprEngine &Eng);
 void RegisterDivZeroChecker(ExprEngine &Eng);
 void RegisterFixedAddressChecker(ExprEngine &Eng);
 void RegisterNoReturnFunctionChecker(ExprEngine &Eng);
-void RegisterObjCAtSyncChecker(ExprEngine &Eng);
 void RegisterPointerArithChecker(ExprEngine &Eng);
 void RegisterPointerSubChecker(ExprEngine &Eng);
 void RegisterReturnPointerRangeChecker(ExprEngine &Eng);
 void RegisterReturnUndefChecker(ExprEngine &Eng);
-void RegisterStackAddrLeakChecker(ExprEngine &Eng);
 void RegisterUndefBranchChecker(ExprEngine &Eng);
 void RegisterUndefCapturedBlockVarChecker(ExprEngine &Eng);
 void RegisterUndefResultChecker(ExprEngine &Eng);
 void RegisterUndefinedArraySubscriptChecker(ExprEngine &Eng);
 void RegisterUndefinedAssignmentChecker(ExprEngine &Eng);
 void RegisterVLASizeChecker(ExprEngine &Eng);
-void registerObjCSelfInitChecker(ExprEngine &Eng);
 
 // API checks.
-void RegisterMacOSXAPIChecker(ExprEngine &Eng);
 void RegisterOSAtomicChecker(ExprEngine &Eng);
-void RegisterUnixAPIChecker(ExprEngine &Eng);
 
 } // end GR namespace
 
index a5cab4ed0ddb0638320d90a43b4486a392e732f0..3cefded87742b70f59ed12f4d16c9dc63dd2a7e6 100644 (file)
@@ -15,7 +15,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "InternalChecks.h"
+#include "ClangSACheckers.h"
 #include "clang/Basic/TargetInfo.h"
 #include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
 #include "clang/StaticAnalyzer/Core/PathSensitive/CheckerVisitor.h"
@@ -45,9 +45,8 @@ public:
 };
 } //end anonymous namespace
 
-void ento::RegisterMacOSXAPIChecker(ExprEngine &Eng) {
-  if (Eng.getContext().Target.getTriple().getVendor() == llvm::Triple::Apple)
-    Eng.registerCheck(new MacOSXAPIChecker());
+void ento::registerMacOSXAPIChecker(ExprEngine &Eng) {
+  Eng.registerCheck(new MacOSXAPIChecker());
 }
 
 //===----------------------------------------------------------------------===//
index 62dfaa26741f13f521013d978349fb5787e15ab7..8285ef4c3139e6fa2664a8b49d47c0314adfe53d 100644 (file)
@@ -12,7 +12,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "InternalChecks.h"
+#include "ClangSACheckers.h"
 #include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
 #include "clang/StaticAnalyzer/Checkers/DereferenceChecker.h"
 #include "clang/StaticAnalyzer/Core/PathSensitive/CheckerVisitor.h"
@@ -33,7 +33,7 @@ public:
 };
 } // end anonymous namespace
 
-void ento::RegisterObjCAtSyncChecker(ExprEngine &Eng) {
+void ento::registerObjCAtSyncChecker(ExprEngine &Eng) {
   // @synchronized is an Objective-C 2 feature.
   if (Eng.getContext().getLangOptions().ObjC2)
     Eng.registerCheck(new ObjCAtSyncChecker());
index 9737683656b0bf0f5170606c5d93bb50d5f267af..f3810e04ff1c702c59fb5dca47fb97578f1bfd87 100644 (file)
@@ -46,7 +46,7 @@
 // objects in the diagnostics.
 // http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocAllocInit.html
 
-#include "InternalChecks.h"
+#include "ClangSACheckers.h"
 #include "clang/StaticAnalyzer/Core/PathSensitive/CheckerVisitor.h"
 #include "clang/StaticAnalyzer/Core/PathSensitive/GRStateTrait.h"
 #include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
index 3dda7251e8e8ae0d3b4473024a794e71c03b6d40..7d5da0d0fe0df1e4b376405c2b6dac0d709713d1 100644 (file)
@@ -12,7 +12,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "InternalChecks.h"
+#include "ClangSACheckers.h"
 #include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
 #include "clang/StaticAnalyzer/Core/PathSensitive/CheckerVisitor.h"
 #include "clang/StaticAnalyzer/Core/PathSensitive/GRState.h"
@@ -41,7 +41,7 @@ private:
 };
 }
 
-void ento::RegisterStackAddrLeakChecker(ExprEngine &Eng) {
+void ento::registerStackAddrLeakChecker(ExprEngine &Eng) {
   Eng.registerCheck(new StackAddrLeakChecker());
 }
 
index b0fb71fee0f6f171bb2e04dd58f73fc956fc479e..d7108d432c4703b0e97d532bb5f144c6a47de2ba 100644 (file)
@@ -12,7 +12,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "InternalChecks.h"
+#include "ClangSACheckers.h"
 #include "clang/Basic/TargetInfo.h"
 #include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
 #include "clang/StaticAnalyzer/Core/PathSensitive/CheckerVisitor.h"
@@ -46,7 +46,7 @@ public:
 };
 } //end anonymous namespace
 
-void ento::RegisterUnixAPIChecker(ExprEngine &Eng) {
+void ento::registerUnixAPIChecker(ExprEngine &Eng) {
   Eng.registerCheck(new UnixAPIChecker());
 }
 
index 38a1966c71c3f6106eb2d33f7a48b427ef68abc6..6c8f55f308e78596a71089a71e42fc12d623a7fa 100644 (file)
@@ -30,6 +30,7 @@
 #include "clang/StaticAnalyzer/Core/PathDiagnosticClients.h"
 
 // FIXME: Restructure checker registration.
+#include "../Checkers/ClangSACheckers.h"
 #include "../Checkers/ExperimentalChecks.h"
 #include "../Checkers/InternalChecks.h"
 
index f00228466f713e489f5bb3705f89db55d3d3a094..e9085c4047692307ee3fb76b20afbbb7ea34fe35 100644 (file)
@@ -1,12 +1,12 @@
 // NOTE: Use '-fobjc-gc' to test the analysis being run twice, and multiple reports are not issued.
-// RUN: %clang_cc1 -triple i386-apple-darwin10 -analyze -analyzer-experimental-internal-checks -analyzer-check-objc-mem -analyzer-store=basic -fobjc-gc -analyzer-constraints=basic -verify -fblocks -Wno-unreachable-code %s
-// RUN: %clang_cc1 -triple i386-apple-darwin10 -analyze -analyzer-experimental-internal-checks -analyzer-check-objc-mem -analyzer-store=basic -analyzer-constraints=range -verify -fblocks -Wno-unreachable-code %s
-// RUN: %clang_cc1 -triple i386-apple-darwin10 -analyze -analyzer-experimental-internal-checks -analyzer-check-objc-mem -analyzer-store=region -analyzer-constraints=basic -verify -fblocks -Wno-unreachable-code %s
-// RUN: %clang_cc1 -triple i386-apple-darwin10 -analyze -analyzer-experimental-internal-checks -analyzer-check-objc-mem -analyzer-store=region -analyzer-constraints=range -verify -fblocks -Wno-unreachable-code %s
-// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -analyze -analyzer-experimental-internal-checks -analyzer-check-objc-mem -analyzer-store=basic -fobjc-gc -analyzer-constraints=basic -verify -fblocks -Wno-unreachable-code %s
-// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -analyze -analyzer-experimental-internal-checks -analyzer-check-objc-mem -analyzer-store=basic -analyzer-constraints=range -verify -fblocks -Wno-unreachable-code %s
-// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -analyze -analyzer-experimental-internal-checks -analyzer-check-objc-mem -analyzer-store=region -analyzer-constraints=basic -verify -fblocks -Wno-unreachable-code %s
-// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -analyze -analyzer-experimental-internal-checks -analyzer-check-objc-mem -analyzer-store=region -analyzer-constraints=range -verify -fblocks -Wno-unreachable-code %s
+// RUN: %clang_cc1 -triple i386-apple-darwin10 -analyze -analyzer-experimental-internal-checks -analyzer-check-objc-mem -analyzer-checker=cocoa.AtSync -analyzer-store=basic -fobjc-gc -analyzer-constraints=basic -verify -fblocks -Wno-unreachable-code %s
+// RUN: %clang_cc1 -triple i386-apple-darwin10 -analyze -analyzer-experimental-internal-checks -analyzer-check-objc-mem -analyzer-checker=cocoa.AtSync -analyzer-store=basic -analyzer-constraints=range -verify -fblocks -Wno-unreachable-code %s
+// RUN: %clang_cc1 -triple i386-apple-darwin10 -analyze -analyzer-experimental-internal-checks -analyzer-check-objc-mem -analyzer-checker=cocoa.AtSync -analyzer-store=region -analyzer-constraints=basic -verify -fblocks -Wno-unreachable-code %s
+// RUN: %clang_cc1 -triple i386-apple-darwin10 -analyze -analyzer-experimental-internal-checks -analyzer-check-objc-mem -analyzer-checker=cocoa.AtSync -analyzer-store=region -analyzer-constraints=range -verify -fblocks -Wno-unreachable-code %s
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -analyze -analyzer-experimental-internal-checks -analyzer-check-objc-mem -analyzer-checker=cocoa.AtSync -analyzer-store=basic -fobjc-gc -analyzer-constraints=basic -verify -fblocks -Wno-unreachable-code %s
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -analyze -analyzer-experimental-internal-checks -analyzer-check-objc-mem -analyzer-checker=cocoa.AtSync -analyzer-store=basic -analyzer-constraints=range -verify -fblocks -Wno-unreachable-code %s
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -analyze -analyzer-experimental-internal-checks -analyzer-check-objc-mem -analyzer-checker=cocoa.AtSync -analyzer-store=region -analyzer-constraints=basic -verify -fblocks -Wno-unreachable-code %s
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -analyze -analyzer-experimental-internal-checks -analyzer-check-objc-mem -analyzer-checker=cocoa.AtSync -analyzer-store=region -analyzer-constraints=range -verify -fblocks -Wno-unreachable-code %s
 
 #ifndef __clang_analyzer__
 #error __clang__analyzer__ not defined
index 342b3b1430a201dda2f4d7f5d26422bdf00d0777..0ee8434080851c9cee5fbb874cbb3887b0ba6d07 100644 (file)
@@ -1,5 +1,5 @@
-// RUN: %clang_cc1 -analyze -analyzer-check-objc-mem -analyzer-store=basic -fblocks -verify %s
-// RUN: %clang_cc1 -analyze -analyzer-check-objc-mem -analyzer-store=region -fblocks -verify %s
+// RUN: %clang_cc1 -analyze -analyzer-check-objc-mem -analyzer-checker=core.StackAddrLeak -analyzer-store=basic -fblocks -verify %s
+// RUN: %clang_cc1 -analyze -analyzer-check-objc-mem -analyzer-checker=core.StackAddrLeak -analyzer-store=region -fblocks -verify %s
 
 int* f1() {
   int x = 0;
index 39808ed873c80317258a1decea7cc5ac8bcbbef4..359e482c8cff70d87633667e2a49a585aaa344b3 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -analyze -analyzer-check-objc-mem -analyzer-store region -verify %s
+// RUN: %clang_cc1 -analyze -analyzer-check-objc-mem -analyzer-checker=core.StackAddrLeak -analyzer-store region -verify %s
 
 char const *p;
 
index e348beb322dd3df6bce3a860565b5518717b57d6..9f5362d184ff00dc48ced61267787973bd84ecfc 100644 (file)
@@ -1,5 +1,5 @@
-// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -analyze -analyzer-check-objc-mem %s -analyzer-store=region -fblocks -verify
-// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -analyze -analyzer-check-objc-mem %s -analyzer-store=basic -fblocks -verify
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -analyze -analyzer-check-objc-mem -analyzer-checker=unix.API -analyzer-checker=macosx.API %s -analyzer-store=region -fblocks -verify
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -analyze -analyzer-check-objc-mem -analyzer-checker=unix.API -analyzer-checker=macosx.API %s -analyzer-store=basic -fblocks -verify
 
 struct _opaque_pthread_once_t {
   long __sig;