[cfe-commits] r41853 - /cfe/trunk/Analysis/DeadStores.cpp

Ted Kremenek kremenek at apple.com
Tue Sep 11 10:24:15 PDT 2007


Author: kremenek
Date: Tue Sep 11 12:24:14 2007
New Revision: 41853

URL: http://llvm.org/viewvc/llvm-project?rev=41853&view=rev
Log:
For looking at "dead stores" in declarations, we now check to see
if the assigned value is a constant expression, e.g.:

int x = 0;

We then check to see if "x" is ever reassigned later.  If so, we don't
emit a warning.  This is because programmers frequently use defensive
programming to make sure a variable has a defined value.

Modified:
    cfe/trunk/Analysis/DeadStores.cpp

Modified: cfe/trunk/Analysis/DeadStores.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Analysis/DeadStores.cpp?rev=41853&r1=41852&r2=41853&view=diff

==============================================================================
--- cfe/trunk/Analysis/DeadStores.cpp (original)
+++ cfe/trunk/Analysis/DeadStores.cpp Tue Sep 11 12:24:14 2007
@@ -18,6 +18,7 @@
 #include "clang/AST/CFG.h"
 #include "clang/Basic/Diagnostic.h"
 #include "clang/Lex/Preprocessor.h"
+#include "clang/AST/ASTContext.h"
 
 using namespace clang;
 
@@ -25,8 +26,11 @@
 
 class DeadStoreObserver : public LiveVariablesObserver {
   Preprocessor& PP;
+  ASTContext Ctx;
 public:
-  DeadStoreObserver(Preprocessor& pp) : PP(pp) {}
+  DeadStoreObserver(Preprocessor& pp) : 
+    PP(pp), Ctx(PP.getTargetInfo(), PP.getIdentifierTable()) {}
+    
   virtual ~DeadStoreObserver() {}
 
   virtual void ObserveStmt(Stmt* S, LiveVariables& L, llvm::BitVector& Live) {                                 
@@ -52,12 +56,22 @@
       for (VarDecl* V = cast<VarDecl>(DS->getDecl()); V != NULL ; 
                     V = cast_or_null<VarDecl>(V->getNextDeclarator()))
         if (Expr* E = V->getInit())
-          if (!L.isLive(Live,V)) {
-            SourceRange R = E->getSourceRange();
-            PP.getDiagnostics().Report(V->getLocation(),
-                                       diag::warn_dead_store, 0, 0,
-                                       &R,1);
-          }
+          if (!L.isLive(Live,V))
+            // Special case: check for initializations with constants.
+            //
+            //  e.g. : int x = 0;
+            //
+            // If x is EVER assigned a new value later, don't issue
+            // a warning.  This is because such initialization can be
+            // due to defensive programming.
+            if (!E->isConstantExpr(Ctx,NULL) || 
+                L.getVarInfo(V).Kills.size() == 0) {
+              // Flag a warning.
+              SourceRange R = E->getSourceRange();
+              PP.getDiagnostics().Report(V->getLocation(),
+                                         diag::warn_dead_store, 0, 0,
+                                         &R,1);
+            }
     }
   }
 };





More information about the cfe-commits mailing list