[cfe-commits] r68504 - in /cfe/trunk/lib/Analysis: CheckDeadStores.cpp LiveVariables.cpp

Ted Kremenek kremenek at apple.com
Mon Apr 6 22:25:24 PDT 2009


Author: kremenek
Date: Tue Apr  7 00:25:24 2009
New Revision: 68504

URL: http://llvm.org/viewvc/llvm-project?rev=68504&view=rev
Log:
Remove hack from LiveVariables analysis where variables whose address are taken
are considered 'live'. This hack isn't needed anymore because we have a
separation in the path-sensitive analyzer between variable names and bindings;
the analyzer can continue to reason about the storage of a variable after its
name is no longer directly referenced.  Now the live variables analysis literally means "is this name live".

Along this line, update the dead stores checker to explicitly look for variables
whose values have escaped.

Modified:
    cfe/trunk/lib/Analysis/CheckDeadStores.cpp
    cfe/trunk/lib/Analysis/LiveVariables.cpp

Modified: cfe/trunk/lib/Analysis/CheckDeadStores.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CheckDeadStores.cpp?rev=68504&r1=68503&r2=68504&view=diff

==============================================================================
--- cfe/trunk/lib/Analysis/CheckDeadStores.cpp (original)
+++ cfe/trunk/lib/Analysis/CheckDeadStores.cpp Tue Apr  7 00:25:24 2009
@@ -17,9 +17,11 @@
 #include "clang/Analysis/Visitors/CFGRecStmtVisitor.h"
 #include "clang/Analysis/PathSensitive/BugReporter.h"
 #include "clang/Analysis/PathSensitive/GRExprEngine.h"
+#include "clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h"
 #include "clang/Basic/Diagnostic.h"
 #include "clang/AST/ASTContext.h"
 #include "clang/AST/ParentMap.h"
+#include "llvm/ADT/SmallPtrSet.h"
 #include "llvm/Support/Compiler.h"
 
 using namespace clang;
@@ -30,16 +32,20 @@
   ASTContext &Ctx;
   BugReporter& BR;
   ParentMap& Parents;
+  llvm::SmallPtrSet<VarDecl*, 20> Escaped;
   
   enum DeadStoreKind { Standard, Enclosing, DeadIncrement, DeadInit };
     
 public:
-  DeadStoreObs(ASTContext &ctx, BugReporter& br, ParentMap& parents)
-    : Ctx(ctx), BR(br), Parents(parents) {}
+  DeadStoreObs(ASTContext &ctx, BugReporter& br, ParentMap& parents,
+               llvm::SmallPtrSet<VarDecl*, 20> &escaped)
+    : Ctx(ctx), BR(br), Parents(parents), Escaped(escaped) {}
   
   virtual ~DeadStoreObs() {}
 
   void Report(VarDecl* V, DeadStoreKind dsk, SourceLocation L, SourceRange R) {
+    if (Escaped.count(V))
+      return;
 
     std::string name = V->getNameAsString();
     
@@ -219,7 +225,35 @@
 // Driver function to invoke the Dead-Stores checker on a CFG.
 //===----------------------------------------------------------------------===//
 
-void clang::CheckDeadStores(LiveVariables& L, BugReporter& BR) {  
-  DeadStoreObs A(BR.getContext(), BR, BR.getParentMap());
+namespace {
+class VISIBILITY_HIDDEN FindEscaped : public CFGRecStmtDeclVisitor<FindEscaped>{
+  CFG *cfg;
+public:
+  FindEscaped(CFG *c) : cfg(c) {}
+  
+  CFG& getCFG() { return *cfg; }
+  
+  llvm::SmallPtrSet<VarDecl*, 20> Escaped;
+
+  void VisitUnaryOperator(UnaryOperator* U) {
+    // Check for '&'.  Any VarDecl whose value has its address-taken we
+    // treat as escaped.
+    Expr* E = U->getSubExpr()->IgnoreParenCasts();
+    if (U->getOpcode() == UnaryOperator::AddrOf)
+      if (DeclRefExpr* DR = dyn_cast<DeclRefExpr>(E))
+        if (VarDecl* VD = dyn_cast<VarDecl>(DR->getDecl())) {
+          Escaped.insert(VD);
+          return;
+        }
+    Visit(E);
+  }
+};
+} // end anonymous namespace
+  
+
+void clang::CheckDeadStores(LiveVariables& L, BugReporter& BR) {
+  FindEscaped FS(BR.getCFG());
+  FS.getCFG().VisitBlockStmts(FS);  
+  DeadStoreObs A(BR.getContext(), BR, BR.getParentMap(), FS.Escaped);
   L.runOnAllBlocks(*BR.getCFG(), &A);
 }

Modified: cfe/trunk/lib/Analysis/LiveVariables.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/LiveVariables.cpp?rev=68504&r1=68503&r2=68504&view=diff

==============================================================================
--- cfe/trunk/lib/Analysis/LiveVariables.cpp (original)
+++ cfe/trunk/lib/Analysis/LiveVariables.cpp Tue Apr  7 00:25:24 2009
@@ -74,28 +74,10 @@
       AlwaysLive.push_back(VD);    
   }
   
-  void VisitUnaryOperator(UnaryOperator* U) {
-    // Check for '&'.  Any VarDecl whose value has its address-taken we
-    // treat as always being live (flow-insensitive).
-
-    Expr* E = U->getSubExpr()->IgnoreParenCasts();
-    
-    if (U->getOpcode() == UnaryOperator::AddrOf)
-      if (DeclRefExpr* DR = dyn_cast<DeclRefExpr>(E))
-        if (VarDecl* VD = dyn_cast<VarDecl>(DR->getDecl())) {
-          AD.Register(VD);
-          AlwaysLive.push_back(VD);
-          return;
-        }
-      
-    Visit(E);
-  }
-    
   CFG& getCFG() { return AD.getCFG(); }
 };
 } // end anonymous namespace
 
-
 LiveVariables::LiveVariables(ASTContext& Ctx, CFG& cfg) {
   // Register all referenced VarDecls.
   getAnalysisData().setCFG(cfg);





More information about the cfe-commits mailing list