]> granicus.if.org Git - clang/commitdiff
Add version of GRExprEngine::AddCheck that registered a GRSimpleAPICheck that
authorTed Kremenek <kremenek@apple.com>
Mon, 30 Mar 2009 17:53:05 +0000 (17:53 +0000)
committerTed Kremenek <kremenek@apple.com>
Mon, 30 Mar 2009 17:53:05 +0000 (17:53 +0000)
will be called for every expression in a basic block.

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

include/clang/Analysis/PathSensitive/GRExprEngine.h
lib/Analysis/GRExprEngine.cpp

index 4c0abdcb0942c060164fabebaf040addfdd45dda..1dee5d267adf6666a0b5f2494c3bef314ba85008 100644 (file)
@@ -395,6 +395,7 @@ public:
   }
 
   void AddCheck(GRSimpleAPICheck* A, Stmt::StmtClass C);
+  void AddCheck(GRSimpleAPICheck* A);
   
   /// ProcessStmt - Called by GRCoreEngine. Used to generate new successor
   ///  nodes by processing the 'effects' of a block-level statement.  
index 41f6453a9033e2c87841d4ef8a5c193c42993803..2b5808f562e9c3faa96729f297b06f88bfab314a 100644 (file)
@@ -46,9 +46,11 @@ class VISIBILITY_HIDDEN MappedBatchAuditor : public GRSimpleAPICheck {
   
   MapTy M;
   Checks::Factory F;
+  Checks AllStmts;
 
 public:
-  MappedBatchAuditor(llvm::BumpPtrAllocator& Alloc) : F(Alloc) {}
+  MappedBatchAuditor(llvm::BumpPtrAllocator& Alloc) :
+    F(Alloc), AllStmts(F.GetEmptyList()) {}
   
   virtual ~MappedBatchAuditor() {
     llvm::DenseSet<GRSimpleAPICheck*> AlreadyVisited;
@@ -66,26 +68,33 @@ public:
       }
   }
 
-  void AddCheck(GRSimpleAPICheckA, Stmt::StmtClass C) {
+  void AddCheck(GRSimpleAPICheck *A, Stmt::StmtClass C) {
     assert (A && "Check cannot be null.");
     void* key = reinterpret_cast<void*>((uintptr_t) C);
     MapTy::iterator I = M.find(key);
     M[key] = F.Concat(A, I == M.end() ? F.GetEmptyList() : I->second);
   }
+  
+  void AddCheck(GRSimpleAPICheck *A) {
+    assert (A && "Check cannot be null.");
+    AllStmts = F.Concat(A, AllStmts);    
+  }
 
   virtual bool Audit(NodeTy* N, GRStateManager& VMgr) {
+    // First handle the auditors that accept all statements.
+    bool isSink = false;
+    for (Checks::iterator I = AllStmts.begin(), E = AllStmts.end(); I!=E; ++I)
+      isSink |= (*I)->Audit(N, VMgr);
+    
+    // Next handle the auditors that accept only specific statements.
     Stmt* S = cast<PostStmt>(N->getLocation()).getStmt();
     void* key = reinterpret_cast<void*>((uintptr_t) S->getStmtClass());
     MapTy::iterator MI = M.find(key);
-
-    if (MI == M.end())
-      return false;
-    
-    bool isSink = false;
+    if (MI != M.end()) {    
+      for (Checks::iterator I=MI->second.begin(), E=MI->second.end(); I!=E; ++I)
+        isSink |= (*I)->Audit(N, VMgr);
+    }
     
-    for (Checks::iterator I=MI->second.begin(), E=MI->second.end(); I!=E; ++I)
-      isSink |= (*I)->Audit(N, VMgr);
-
     return isSink;    
   }
 };
@@ -143,6 +152,13 @@ void GRExprEngine::AddCheck(GRSimpleAPICheck* A, Stmt::StmtClass C) {
   ((MappedBatchAuditor*) BatchAuditor.get())->AddCheck(A, C);
 }
 
+void GRExprEngine::AddCheck(GRSimpleAPICheck *A) {
+  if (!BatchAuditor)
+    BatchAuditor.reset(new MappedBatchAuditor(getGraph().getAllocator()));
+
+  ((MappedBatchAuditor*) BatchAuditor.get())->AddCheck(A);
+}
+
 const GRState* GRExprEngine::getInitialState() {
   return StateMgr.getInitialState();
 }