[cfe-commits] r53906 - in /cfe/trunk/lib/Analysis: CheckDeadStores.cpp DeadStores.cpp
Ted Kremenek
kremenek at apple.com
Tue Jul 22 07:41:53 PDT 2008
Author: kremenek
Date: Tue Jul 22 09:41:47 2008
New Revision: 53906
URL: http://llvm.org/viewvc/llvm-project?rev=53906&view=rev
Log:
Rename file.
Added:
cfe/trunk/lib/Analysis/CheckDeadStores.cpp
- copied unchanged from r53905, cfe/trunk/lib/Analysis/DeadStores.cpp
Removed:
cfe/trunk/lib/Analysis/DeadStores.cpp
Removed: cfe/trunk/lib/Analysis/DeadStores.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/DeadStores.cpp?rev=53905&view=auto
==============================================================================
--- cfe/trunk/lib/Analysis/DeadStores.cpp (original)
+++ cfe/trunk/lib/Analysis/DeadStores.cpp (removed)
@@ -1,152 +0,0 @@
-//==- DeadStores.cpp - Check for stores to dead variables --------*- C++ -*-==//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file defines a DeadStores, a flow-sensitive checker that looks for
-// stores to variables that are no longer live.
-//
-//===----------------------------------------------------------------------===//
-
-#include "clang/Analysis/LocalCheckers.h"
-#include "clang/Analysis/Analyses/LiveVariables.h"
-#include "clang/Analysis/Visitors/CFGRecStmtVisitor.h"
-#include "clang/Analysis/PathSensitive/BugReporter.h"
-#include "clang/Analysis/PathSensitive/GRExprEngine.h"
-#include "clang/Basic/Diagnostic.h"
-#include "clang/AST/ASTContext.h"
-#include "clang/AST/ParentMap.h"
-#include "llvm/Support/Compiler.h"
-
-using namespace clang;
-
-namespace {
-
-class VISIBILITY_HIDDEN DeadStoreObs : public LiveVariables::ObserverTy {
- ASTContext &Ctx;
- BugReporter& BR;
- ParentMap& Parents;
-
-public:
- DeadStoreObs(ASTContext &ctx, BugReporter& br, ParentMap& parents)
- : Ctx(ctx), BR(br), Parents(parents) {}
-
- virtual ~DeadStoreObs() {}
-
- void Report(VarDecl* V, bool inEnclosing, SourceLocation L, SourceRange R,
- bool isInitialization = false) {
-
- std::string name(V->getName());
-
- if (isInitialization) {
- std::string msg = "Value stored to '" + name +
- "' during its initialization is never read";
-
- BR.EmitBasicReport("dead initialization", msg.c_str(), L, R);
- }
- else {
- std::string msg = inEnclosing
- ? "Although the value stored to '" + name +
- "' is used in the enclosing expression, the value is never actually"
- " read from '" + name + "'"
- : "Value stored to '" + name + "' is never read";
-
- BR.EmitBasicReport("dead store", msg.c_str(), L, R);
- }
- }
-
- void CheckVarDecl(VarDecl* VD, Expr* Ex, Expr* Val,
- bool hasEnclosing,
- const LiveVariables::AnalysisDataTy& AD,
- const LiveVariables::ValTy& Live) {
-
- if (VD->hasLocalStorage() && !Live(VD, AD))
- Report(VD, hasEnclosing, Ex->getSourceRange().getBegin(),
- Val->getSourceRange());
- }
-
- void CheckDeclRef(DeclRefExpr* DR, Expr* Val,
- const LiveVariables::AnalysisDataTy& AD,
- const LiveVariables::ValTy& Live) {
-
- if (VarDecl* VD = dyn_cast<VarDecl>(DR->getDecl()))
- CheckVarDecl(VD, DR, Val, false, AD, Live);
- }
-
- virtual void ObserveStmt(Stmt* S,
- const LiveVariables::AnalysisDataTy& AD,
- const LiveVariables::ValTy& Live) {
-
- // Skip statements in macros.
- if (S->getLocStart().isMacroID())
- return;
-
- if (BinaryOperator* B = dyn_cast<BinaryOperator>(S)) {
- if (!B->isAssignmentOp()) return; // Skip non-assignments.
-
- if (DeclRefExpr* DR = dyn_cast<DeclRefExpr>(B->getLHS()))
- if (VarDecl *VD = dyn_cast<VarDecl>(DR->getDecl())) {
-
- // Special case: check for assigning null to a pointer. This
- // is a common form of defensive programming.
- // FIXME: Make this optional?
-
- Expr* Val = B->getRHS();
- llvm::APSInt Result(Ctx.getTypeSize(Val->getType()));
-
- if (VD->getType()->isPointerType() &&
- Val->IgnoreParenCasts()->isIntegerConstantExpr(Result, Ctx, 0))
- if (Result == 0)
- return;
-
- CheckVarDecl(VD, DR, Val, Parents.isSubExpr(B), AD, Live);
- }
- }
- else if (UnaryOperator* U = dyn_cast<UnaryOperator>(S)) {
- if (!U->isIncrementOp())
- return;
-
- Expr *Ex = U->getSubExpr()->IgnoreParenCasts();
-
- if (DeclRefExpr* DR = dyn_cast<DeclRefExpr>(Ex))
- CheckDeclRef(DR, U, AD, Live);
- }
- else if (DeclStmt* DS = dyn_cast<DeclStmt>(S))
- // Iterate through the decls. Warn if any initializers are complex
- // expressions that are not live (never used).
- for (ScopedDecl* SD = DS->getDecl(); SD; SD = SD->getNextDeclarator()) {
-
- VarDecl* V = dyn_cast<VarDecl>(SD);
- if (!V) continue;
-
- if (V->hasLocalStorage())
- if (Expr* E = V->getInit())
- if (!Live(V, AD)) {
- // 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))
- Report(V, false, V->getLocation(), E->getSourceRange(), true);
- }
- }
- }
-};
-
-} // end anonymous namespace
-
-//===----------------------------------------------------------------------===//
-// Driver function to invoke the Dead-Stores checker on a CFG.
-//===----------------------------------------------------------------------===//
-
-void clang::CheckDeadStores(LiveVariables& L, BugReporter& BR) {
- DeadStoreObs A(BR.getContext(), BR, BR.getParentMap());
- L.runOnAllBlocks(*BR.getCFG(), &A);
-}
More information about the cfe-commits
mailing list