summaryrefslogtreecommitdiffstats
path: root/clang/Analysis/DeadStores.cpp
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
commit2f1a79d32923c70281a389a8ffdcbcf99fa10e65 (patch)
treef4b47672014e6d2e6ad3be55e977d2940315790c /clang/Analysis/DeadStores.cpp
parent74fb0f1a1c7564b9a4919ba06ce6c7863e77a2d5 (diff)
downloadbcm5719-llvm-2f1a79d32923c70281a389a8ffdcbcf99fa10e65.tar.gz
bcm5719-llvm-2f1a79d32923c70281a389a8ffdcbcf99fa10e65.zip
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. llvm-svn: 41853
Diffstat (limited to 'clang/Analysis/DeadStores.cpp')
-rw-r--r--clang/Analysis/DeadStores.cpp28
1 files changed, 21 insertions, 7 deletions
diff --git a/clang/Analysis/DeadStores.cpp b/clang/Analysis/DeadStores.cpp
index e547989f6b8..91034e38944 100644
--- a/clang/Analysis/DeadStores.cpp
+++ b/clang/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);
+ }
}
}
};
OpenPOWER on IntegriCloud