aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2007-09-11 17:24:14 +0000
committerTed Kremenek <kremenek@apple.com>2007-09-11 17:24:14 +0000
commitce1cab9fc0b4aec9cdef1b30a14e4ccdca3ac5f1 (patch)
treeaf00fa36cad87b13f179746cb0e40325af8f439f
parenta596533c986e33363db80a00fb4139ea2e03ca63 (diff)
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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41853 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--Analysis/DeadStores.cpp28
1 files changed, 21 insertions, 7 deletions
diff --git a/Analysis/DeadStores.cpp b/Analysis/DeadStores.cpp
index e547989f6b..91034e3894 100644
--- a/Analysis/DeadStores.cpp
+++ b/Analysis/DeadStores.cpp
@@ -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);
+ }
}
}
};