diff options
| author | Ted Kremenek <kremenek@apple.com> | 2007-09-11 17:24:14 +0000 |
|---|---|---|
| committer | Ted Kremenek <kremenek@apple.com> | 2007-09-11 17:24:14 +0000 |
| commit | 2f1a79d32923c70281a389a8ffdcbcf99fa10e65 (patch) | |
| tree | f4b47672014e6d2e6ad3be55e977d2940315790c /clang/Analysis/DeadStores.cpp | |
| parent | 74fb0f1a1c7564b9a4919ba06ce6c7863e77a2d5 (diff) | |
| download | bcm5719-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.cpp | 28 |
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); + } } } }; |

