[cfe-commits] r53048 - in /cfe/trunk: Driver/AnalysisConsumer.cpp include/clang/Analysis/PathSensitive/BugReporter.h include/clang/Analysis/PathSensitive/GRExprEngine.h lib/Analysis/BugReporter.cpp lib/Analysis/CFRefCount.cpp lib/Analysis/DeadStores.cpp lib/Analysis/GRExprEngine.cpp lib/Analysis/GRSimpleVals.cpp
Ted Kremenek
kremenek at apple.com
Wed Jul 2 14:24:01 PDT 2008
Author: kremenek
Date: Wed Jul 2 16:24:01 2008
New Revision: 53048
URL: http://llvm.org/viewvc/llvm-project?rev=53048&view=rev
Log:
Refactored some of the BugReporter interface so that data such as the ASTContext&, PathDiagnosticClient*, can be provided by an external source.
Split BugReporter into BugReporter and GRBugReporter so checkers not based on GRExprEngine can still use the BugReporter mechanism.
Modified:
cfe/trunk/Driver/AnalysisConsumer.cpp
cfe/trunk/include/clang/Analysis/PathSensitive/BugReporter.h
cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h
cfe/trunk/lib/Analysis/BugReporter.cpp
cfe/trunk/lib/Analysis/CFRefCount.cpp
cfe/trunk/lib/Analysis/DeadStores.cpp
cfe/trunk/lib/Analysis/GRExprEngine.cpp
cfe/trunk/lib/Analysis/GRSimpleVals.cpp
Modified: cfe/trunk/Driver/AnalysisConsumer.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/AnalysisConsumer.cpp?rev=53048&r1=53047&r2=53048&view=diff
==============================================================================
--- cfe/trunk/Driver/AnalysisConsumer.cpp (original)
+++ cfe/trunk/Driver/AnalysisConsumer.cpp Wed Jul 2 16:24:01 2008
@@ -25,6 +25,7 @@
#include "clang/Basic/SourceManager.h"
#include "clang/Basic/FileManager.h"
#include "clang/AST/ParentMap.h"
+#include "clang/Analysis/PathSensitive/BugReporter.h"
#include "clang/Analysis/Analyses/LiveVariables.h"
#include "clang/Analysis/LocalCheckers.h"
#include "clang/Analysis/PathSensitive/GRTransferFuncs.h"
@@ -98,7 +99,7 @@
};
- class VISIBILITY_HIDDEN AnalysisManager {
+ class VISIBILITY_HIDDEN AnalysisManager : public BugReporterData {
Decl* D;
Stmt* Body;
AnalysisConsumer& C;
@@ -117,25 +118,25 @@
Decl* getCodeDecl() const { return D; }
Stmt* getBody() const { return Body; }
- CFG* getCFG() {
+ virtual CFG& getCFG() {
if (!cfg) cfg.reset(CFG::buildCFG(getBody()));
- return cfg.get();
+ return *cfg.get();
}
- ParentMap* getParentMap() {
+ virtual ParentMap& getParentMap() {
if (!PM) PM.reset(new ParentMap(getBody()));
- return PM.get();
+ return *PM.get();
}
- ASTContext& getContext() {
+ virtual ASTContext& getContext() {
return *C.Ctx;
}
- SourceManager& getSourceManager() {
+ virtual SourceManager& getSourceManager() {
return getContext().getSourceManager();
}
- Diagnostic& getDiagnostic() {
+ virtual Diagnostic& getDiagnostic() {
return C.Diags;
}
@@ -143,20 +144,21 @@
return C.LOpts;
}
- PathDiagnosticClient* getPathDiagnosticClient() {
+ virtual PathDiagnosticClient* getPathDiagnosticClient() {
if (PD.get() == 0 && !C.HTMLDir.empty())
PD.reset(CreateHTMLDiagnosticClient(C.HTMLDir, C.PP, C.PPF));
return PD.get();
}
- LiveVariables* getLiveVariables() {
+ virtual LiveVariables& getLiveVariables() {
if (!liveness) {
- liveness.reset(new LiveVariables(*getCFG()));
- liveness->runOnCFG(*getCFG());
- liveness->runOnAllBlocks(*getCFG(), 0, true);
+ liveness.reset(new LiveVariables(getCFG()));
+ liveness->runOnCFG(getCFG());
+ liveness->runOnAllBlocks(getCFG(), 0, true);
}
- return liveness.get();
+
+ return *liveness.get();
}
bool shouldVisualize() const {
@@ -255,7 +257,7 @@
AnalysisManager mgr(*this, D, Body);
// Dispatch on the actions.
- for (Actions::iterator I = actions.begin(),
+ for (Actions::iterator I = actions.begin(),
E = actions.end(); I != E; ++I)
((*I).getHead())(mgr);
}
@@ -265,13 +267,13 @@
//===----------------------------------------------------------------------===//
static void ActionDeadStores(AnalysisManager& mgr) {
- CheckDeadStores(*mgr.getCFG(), mgr.getContext(),
- *mgr.getLiveVariables(), *mgr.getParentMap(),
+ CheckDeadStores(mgr.getCFG(), mgr.getContext(),
+ mgr.getLiveVariables(), mgr.getParentMap(),
mgr.getDiagnostic());
}
static void ActionUninitVals(AnalysisManager& mgr) {
- CheckUninitializedValues(*mgr.getCFG(), mgr.getContext(),
+ CheckUninitializedValues(mgr.getCFG(), mgr.getContext(),
mgr.getDiagnostic());
}
@@ -285,15 +287,15 @@
mgr.DisplayFunction();
// Construct the analysis engine.
- GRExprEngine Eng(*mgr.getCFG(), *mgr.getCodeDecl(), mgr.getContext(),
- *mgr.getLiveVariables());
+ GRExprEngine Eng(mgr.getCFG(), *mgr.getCodeDecl(), mgr.getContext(),
+ mgr.getLiveVariables());
Eng.setTransferFunctions(tf);
// Execute the worklist algorithm.
Eng.ExecuteWorkList();
// Display warnings.
- Eng.EmitWarnings(mgr.getDiagnostic(), mgr.getPathDiagnosticClient());
+ Eng.EmitWarnings(mgr);
// Visualize the exploded graph.
if (mgr.shouldVisualize())
@@ -337,17 +339,17 @@
static void ActionLiveness(AnalysisManager& mgr) {
mgr.DisplayFunction();
- mgr.getLiveVariables()->dumpBlockLiveness(mgr.getSourceManager());
+ mgr.getLiveVariables().dumpBlockLiveness(mgr.getSourceManager());
}
static void ActionCFGDump(AnalysisManager& mgr) {
mgr.DisplayFunction();
- mgr.getCFG()->dump();
+ mgr.getCFG().dump();
}
static void ActionCFGView(AnalysisManager& mgr) {
mgr.DisplayFunction();
- mgr.getCFG()->viewCFG();
+ mgr.getCFG().viewCFG();
}
//===----------------------------------------------------------------------===//
Modified: cfe/trunk/include/clang/Analysis/PathSensitive/BugReporter.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/BugReporter.h?rev=53048&r1=53047&r2=53048&view=diff
==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/BugReporter.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/BugReporter.h Wed Jul 2 16:24:01 2008
@@ -127,44 +127,100 @@
}
};
+class BugReporterData {
+public:
+ virtual ~BugReporterData();
+ virtual Diagnostic& getDiagnostic() = 0;
+ virtual PathDiagnosticClient* getPathDiagnosticClient() = 0;
+ virtual ASTContext& getContext() = 0;
+ virtual SourceManager& getSourceManager() = 0;
+ virtual CFG& getCFG() = 0;
+ virtual ParentMap& getParentMap() = 0;
+ virtual LiveVariables& getLiveVariables() = 0;
+};
+
class BugReporter {
- Diagnostic& Diag;
- PathDiagnosticClient* PD;
- ASTContext& Ctx;
- GRExprEngine& Eng;
- llvm::SmallSet<SymbolID, 10> NotableSymbols;
+public:
+ enum Kind { BaseBRKind, GRBugReporterKind };
+
+protected:
+ Kind kind;
+ BugReporterData& D;
+
+ BugReporter(BugReporterData& d, Kind k) : kind(k), D(d) {}
public:
- BugReporter(Diagnostic& diag, PathDiagnosticClient* pd,
- ASTContext& ctx, GRExprEngine& eng)
- : Diag(diag), PD(pd), Ctx(ctx), Eng(eng) {}
+ BugReporter(BugReporterData& d) : kind(BaseBRKind), D(d) {}
+ virtual ~BugReporter();
- ~BugReporter();
+ Kind getKind() const { return kind; }
- Diagnostic& getDiagnostic() { return Diag; }
+ Diagnostic& getDiagnostic() {
+ return D.getDiagnostic();
+ }
- PathDiagnosticClient* getDiagnosticClient() { return PD; }
+ PathDiagnosticClient* getPathDiagnosticClient() {
+ return D.getPathDiagnosticClient();
+ }
- ASTContext& getContext() { return Ctx; }
+ ASTContext& getContext() {
+ return D.getContext();
+ }
- SourceManager& getSourceManager() { return Ctx.getSourceManager(); }
+ SourceManager& getSourceManager() {
+ return getContext().getSourceManager();
+ }
- ExplodedGraph<ValueState>& getGraph();
+ CFG& getCFG() {
+ return D.getCFG();
+ }
+
+ ParentMap& getParentMap() {
+ return D.getParentMap();
+ }
+
+ LiveVariables& getLiveVariables() {
+ return D.getLiveVariables();
+ }
+
+ virtual void GeneratePathDiagnostic(PathDiagnostic& PD, BugReport& R) {}
- GRExprEngine& getEngine() { return Eng; }
+ void EmitWarning(BugReport& R);
- ValueStateManager& getStateManager();
+ static bool classof(const BugReporter* R) { return true; }
+};
- CFG& getCFG() { return getGraph().getCFG(); }
+class GRBugReporter : public BugReporter {
+ GRExprEngine& Eng;
+ llvm::SmallSet<SymbolID, 10> NotableSymbols;
+public:
- ParentMap& getParentMap();
+ GRBugReporter(BugReporterData& d, GRExprEngine& eng)
+ : BugReporter(d, GRBugReporterKind), Eng(eng) {}
- void EmitWarning(BugReport& R);
+ virtual ~GRBugReporter();
+
+ GRExprEngine& getEngine() {
+ return Eng;
+ }
+
+ ExplodedGraph<ValueState>& getGraph();
- void GeneratePathDiagnostic(PathDiagnostic& PD, BugReport& R);
+ ValueStateManager& getStateManager();
- void addNotableSymbol(SymbolID Sym) { NotableSymbols.insert(Sym); }
- bool isNotable(SymbolID Sym) const { return (bool) NotableSymbols.count(Sym);}
+ virtual void GeneratePathDiagnostic(PathDiagnostic& PD, BugReport& R);
+
+ void addNotableSymbol(SymbolID Sym) {
+ NotableSymbols.insert(Sym);
+ }
+
+ bool isNotable(SymbolID Sym) const {
+ return (bool) NotableSymbols.count(Sym);
+ }
+
+ static bool classof(const BugReporter* R) {
+ return R->getKind() == GRBugReporterKind;
+ }
};
} // end clang namespace
Modified: cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h?rev=53048&r1=53047&r2=53048&view=diff
==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h Wed Jul 2 16:24:01 2008
@@ -29,6 +29,7 @@
class PathDiagnosticClient;
class Diagnostic;
class ParentMap;
+ class BugReporterData;
class GRExprEngine {
@@ -235,7 +236,7 @@
BugTypes.push_back(B);
}
- void EmitWarnings(Diagnostic& Diag, PathDiagnosticClient* PD);
+ void EmitWarnings(BugReporterData& BRData);
bool isRetStackAddr(const NodeTy* N) const {
return N->isSink() && RetsStackAddr.count(const_cast<NodeTy*>(N)) != 0;
Modified: cfe/trunk/lib/Analysis/BugReporter.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/BugReporter.cpp?rev=53048&r1=53047&r2=53048&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/BugReporter.cpp (original)
+++ cfe/trunk/lib/Analysis/BugReporter.cpp Wed Jul 2 16:24:01 2008
@@ -27,22 +27,20 @@
using namespace clang;
BugReporter::~BugReporter() {}
+GRBugReporter::~GRBugReporter() {}
+BugReporterData::~BugReporterData() {}
BugType::~BugType() {}
BugReport::~BugReport() {}
RangedBugReport::~RangedBugReport() {}
-ExplodedGraph<ValueState>& BugReporter::getGraph() {
+ExplodedGraph<ValueState>& GRBugReporter::getGraph() {
return Eng.getGraph();
}
-ValueStateManager& BugReporter::getStateManager() {
+ValueStateManager& GRBugReporter::getStateManager() {
return Eng.getStateManager();
}
-ParentMap& BugReporter::getParentMap() {
- return Eng.getParentMap();
-}
-
static inline Stmt* GetStmt(const ProgramPoint& P) {
if (const PostStmt* PS = dyn_cast<PostStmt>(&P)) {
return PS->getStmt();
@@ -338,7 +336,7 @@
// specified symbol. Are any of them not in the previous state.
ValueState* St = N->getState();
- ValueStateManager& VMgr = BR.getStateManager();
+ ValueStateManager& VMgr = cast<GRBugReporter>(BR).getStateManager();
// FIXME: Later generalize for a broader memory model.
@@ -411,8 +409,8 @@
}
}
-void BugReporter::GeneratePathDiagnostic(PathDiagnostic& PD,
- BugReport& R) {
+void GRBugReporter::GeneratePathDiagnostic(PathDiagnostic& PD,
+ BugReport& R) {
ExplodedNode<ValueState>* N = R.getEndNode();
@@ -438,6 +436,7 @@
ExplodedNode<ValueState>* NextNode = N->pred_empty()
? NULL : *(N->pred_begin());
+ ASTContext& Ctx = getContext();
SourceManager& SMgr = Ctx.getSourceManager();
while (NextNode) {
@@ -715,6 +714,8 @@
// Emit a full diagnostic for the path if we have a PathDiagnosticClient.
+ PathDiagnosticClient* PD = getPathDiagnosticClient();
+
if (PD && !D->empty()) {
PD->HandlePathDiagnostic(D.take());
return;
@@ -723,7 +724,7 @@
// We don't have a PathDiagnosticClient, but we can still emit a single
// line diagnostic. Determine the location.
- FullSourceLoc L = D->empty() ? R.getLocation(Ctx.getSourceManager())
+ FullSourceLoc L = D->empty() ? R.getLocation(getSourceManager())
: D->back()->getLocation();
@@ -749,7 +750,6 @@
}
else {
std::ostringstream os;
- os << "[CHECKER] ";
if (D->empty())
os << R.getDescription();
@@ -757,6 +757,7 @@
os << D->back()->getString();
+ Diagnostic& Diag = getDiagnostic();
unsigned ErrorDiag = Diag.getCustomDiagID(Diagnostic::Warning,
os.str().c_str());
Modified: cfe/trunk/lib/Analysis/CFRefCount.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CFRefCount.cpp?rev=53048&r1=53047&r2=53048&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/CFRefCount.cpp (original)
+++ cfe/trunk/lib/Analysis/CFRefCount.cpp Wed Jul 2 16:24:01 2008
@@ -2202,7 +2202,7 @@
// Add the range by scanning the children of the statement for any bindings
// to Sym.
- ValueStateManager& VSM = BR.getEngine().getStateManager();
+ ValueStateManager& VSM = cast<GRBugReporter>(BR).getStateManager();
for (Stmt::child_iterator I = S->child_begin(), E = S->child_end(); I!=E; ++I)
if (Expr* Exp = dyn_cast_or_null<Expr>(*I)) {
@@ -2266,7 +2266,7 @@
// Tell the BugReporter to report cases when the tracked symbol is
// assigned to different variables, etc.
- BR.addNotableSymbol(Sym);
+ cast<GRBugReporter>(BR).addNotableSymbol(Sym);
if (!getBugType().isLeak())
return RangedBugReport::getEndPath(BR, EndN);
Modified: cfe/trunk/lib/Analysis/DeadStores.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/DeadStores.cpp?rev=53048&r1=53047&r2=53048&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/DeadStores.cpp (original)
+++ cfe/trunk/lib/Analysis/DeadStores.cpp Wed Jul 2 16:24:01 2008
@@ -242,8 +242,8 @@
DiagCollector C(*this);
DeadStoreObs A(BR.getContext(), BR.getDiagnostic(), C, BR.getParentMap());
- GRExprEngine& Eng = BR.getEngine();
- Eng.getLiveness().runOnAllBlocks(BR.getCFG(), &A);
+
+ BR.getLiveVariables().runOnAllBlocks(BR.getCFG(), &A);
// Emit the bug reports.
Modified: cfe/trunk/lib/Analysis/GRExprEngine.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/GRExprEngine.cpp?rev=53048&r1=53047&r2=53048&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/GRExprEngine.cpp (original)
+++ cfe/trunk/lib/Analysis/GRExprEngine.cpp Wed Jul 2 16:24:01 2008
@@ -108,21 +108,21 @@
};
-void GRExprEngine::EmitWarnings(Diagnostic& Diag, PathDiagnosticClient* PD) {
+void GRExprEngine::EmitWarnings(BugReporterData& BRData) {
for (bug_type_iterator I = bug_types_begin(), E = bug_types_end(); I!=E; ++I){
- BugReporter BR(Diag, PD, getContext(), *this);
+ GRBugReporter BR(BRData, *this);
(*I)->EmitWarnings(BR);
}
for (SimpleChecksTy::iterator I = CallChecks.begin(), E = CallChecks.end();
I != E; ++I) {
- BugReporter BR(Diag, PD, getContext(), *this);
+ GRBugReporter BR(BRData, *this);
(*I)->EmitWarnings(BR);
}
for (SimpleChecksTy::iterator I=MsgExprChecks.begin(), E=MsgExprChecks.end();
I != E; ++I) {
- BugReporter BR(Diag, PD, getContext(), *this);
+ GRBugReporter BR(BRData, *this);
(*I)->EmitWarnings(BR);
}
}
Modified: cfe/trunk/lib/Analysis/GRSimpleVals.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/GRSimpleVals.cpp?rev=53048&r1=53047&r2=53048&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/GRSimpleVals.cpp (original)
+++ cfe/trunk/lib/Analysis/GRSimpleVals.cpp Wed Jul 2 16:24:01 2008
@@ -66,7 +66,7 @@
}
virtual void EmitWarnings(BugReporter& BR) {
- GRExprEngine& Eng = BR.getEngine();
+ GRExprEngine& Eng = cast<GRBugReporter>(BR).getEngine();
GenericEmitWarnings(BR, *this, Eng.null_derefs_begin(),
Eng.null_derefs_end());
}
@@ -83,7 +83,7 @@
}
virtual void EmitWarnings(BugReporter& BR) {
- GRExprEngine& Eng = BR.getEngine();
+ GRExprEngine& Eng = cast<GRBugReporter>(BR).getEngine();
GenericEmitWarnings(BR, *this, Eng.undef_derefs_begin(),
Eng.undef_derefs_end());
}
@@ -113,7 +113,7 @@
}
virtual void EmitWarnings(BugReporter& BR) {
- GRExprEngine& Eng = BR.getEngine();
+ GRExprEngine& Eng = cast<GRBugReporter>(BR).getEngine();
GenericEmitWarnings(BR, *this, Eng.explicit_bad_divides_begin(),
Eng.explicit_bad_divides_end());
}
@@ -130,7 +130,7 @@
}
virtual void EmitWarnings(BugReporter& BR) {
- GRExprEngine& Eng = BR.getEngine();
+ GRExprEngine& Eng = cast<GRBugReporter>(BR).getEngine();
GenericEmitWarnings(BR, *this, Eng.undef_results_begin(),
Eng.undef_results_end());
}
@@ -147,7 +147,7 @@
}
virtual void EmitWarnings(BugReporter& BR) {
- GRExprEngine& Eng = BR.getEngine();
+ GRExprEngine& Eng = cast<GRBugReporter>(BR).getEngine();
GenericEmitWarnings(BR, *this, Eng.bad_calls_begin(),
Eng.bad_calls_end());
}
@@ -168,7 +168,7 @@
}
virtual void EmitWarnings(BugReporter& BR) {
- GRExprEngine& Eng = BR.getEngine();
+ GRExprEngine& Eng = cast<GRBugReporter>(BR).getEngine();
for (GRExprEngine::UndefArgsTy::iterator I = Eng.undef_arg_begin(),
E = Eng.undef_arg_end(); I!=E; ++I) {
@@ -195,7 +195,7 @@
}
virtual void EmitWarnings(BugReporter& BR) {
- GRExprEngine& Eng = BR.getEngine();
+ GRExprEngine& Eng = cast<GRBugReporter>(BR).getEngine();
for (GRExprEngine::UndefArgsTy::iterator I=Eng.msg_expr_undef_arg_begin(),
E = Eng.msg_expr_undef_arg_end(); I!=E; ++I) {
@@ -221,7 +221,7 @@
}
virtual void EmitWarnings(BugReporter& BR) {
- GRExprEngine& Eng = BR.getEngine();
+ GRExprEngine& Eng = cast<GRBugReporter>(BR).getEngine();
for (GRExprEngine::UndefReceiversTy::iterator I=Eng.undef_receivers_begin(),
End = Eng.undef_receivers_end(); I!=End; ++I) {
@@ -252,7 +252,7 @@
}
virtual void EmitWarnings(BugReporter& BR) {
- GRExprEngine& Eng = BR.getEngine();
+ GRExprEngine& Eng = cast<GRBugReporter>(BR).getEngine();
GenericEmitWarnings(BR, *this, Eng.ret_stackaddr_begin(),
Eng.ret_stackaddr_end());
}
@@ -291,7 +291,7 @@
void UndefBranch::EmitWarnings(BugReporter& BR) {
- GRExprEngine& Eng = BR.getEngine();
+ GRExprEngine& Eng = cast<GRBugReporter>(BR).getEngine();
for (GRExprEngine::undef_branch_iterator I=Eng.undef_branches_begin(),
E=Eng.undef_branches_end(); I!=E; ++I) {
More information about the cfe-commits
mailing list