[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