]> granicus.if.org Git - clang/commitdiff
For looking at "dead stores" in declarations, we now check to see
authorTed Kremenek <kremenek@apple.com>
Tue, 11 Sep 2007 17:24:14 +0000 (17:24 +0000)
committerTed Kremenek <kremenek@apple.com>
Tue, 11 Sep 2007 17:24:14 +0000 (17:24 +0000)
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.

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

Analysis/DeadStores.cpp

index e547989f6b8bff12c05c98bf6ef9b5fb4cf0349f..91034e389444e8bb303cb8f5268701ad89242f7d 100644 (file)
@@ -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 @@ namespace {
 
 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 @@ public:
       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);
+            }
     }
   }
 };