forked from OSchip/llvm-project
To make the analysis independent on the locally stored liveness and cfg
of GRStateManager and GRExprEngine, pass the initial location context to the getInitialState() method. llvm-svn: 79228
This commit is contained in:
parent
aa1526419c
commit
5f078cb844
|
@ -79,6 +79,10 @@ public:
|
|||
|
||||
LocationContext *getParent() const { return Parent; }
|
||||
|
||||
LiveVariables *getLiveVariables() const {
|
||||
return getAnalysisContext()->getLiveVariables();
|
||||
}
|
||||
|
||||
void Profile(llvm::FoldingSetNodeID &ID) {
|
||||
Profile(ID, Kind, Ctx, Parent);
|
||||
}
|
||||
|
|
|
@ -69,8 +69,8 @@ class GRCoreEngine {
|
|||
ExplodedNode* Pred);
|
||||
|
||||
/// Get the initial state from the subengine.
|
||||
const GRState* getInitialState() {
|
||||
return SubEngine.getInitialState();
|
||||
const GRState* getInitialState(const LocationContext *InitLoc) {
|
||||
return SubEngine.getInitialState(InitLoc);
|
||||
}
|
||||
|
||||
void ProcessEndPath(GREndPathNodeBuilder& Builder);
|
||||
|
|
|
@ -246,7 +246,7 @@ public:
|
|||
|
||||
/// getInitialState - Return the initial state used for the root vertex
|
||||
/// in the ExplodedGraph.
|
||||
const GRState* getInitialState();
|
||||
const GRState* getInitialState(const LocationContext *InitLoc);
|
||||
|
||||
ExplodedGraph& getGraph() { return G; }
|
||||
const ExplodedGraph& getGraph() const { return G; }
|
||||
|
|
|
@ -454,7 +454,7 @@ public:
|
|||
|
||||
~GRStateManager();
|
||||
|
||||
const GRState *getInitialState();
|
||||
const GRState *getInitialState(const LocationContext *InitLoc);
|
||||
|
||||
ASTContext &getContext() { return ValueMgr.getContext(); }
|
||||
const ASTContext &getContext() const { return ValueMgr.getContext(); }
|
||||
|
|
|
@ -25,12 +25,13 @@ class GRBranchNodeBuilder;
|
|||
class GRIndirectGotoNodeBuilder;
|
||||
class GRSwitchNodeBuilder;
|
||||
class GREndPathNodeBuilder;
|
||||
class LocationContext;
|
||||
|
||||
class GRSubEngine {
|
||||
public:
|
||||
virtual ~GRSubEngine() {}
|
||||
|
||||
virtual const GRState* getInitialState() = 0;
|
||||
virtual const GRState* getInitialState(const LocationContext *InitLoc) = 0;
|
||||
|
||||
virtual GRStateManager& getStateManager() = 0;
|
||||
|
||||
|
|
|
@ -77,7 +77,7 @@ public:
|
|||
|
||||
/// getInitialStore - Returns the initial "empty" store representing the
|
||||
/// value bindings upon entry to an analyzed function.
|
||||
virtual Store getInitialStore() = 0;
|
||||
virtual Store getInitialStore(const LocationContext *InitLoc) = 0;
|
||||
|
||||
/// getRegionManager - Returns the internal RegionManager object that is
|
||||
/// used to query and manipulate MemRegion objects.
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
|
||||
#include "clang/AST/ExprObjC.h"
|
||||
#include "clang/Analysis/Analyses/LiveVariables.h"
|
||||
#include "clang/Analysis/PathSensitive/AnalysisContext.h"
|
||||
#include "clang/Analysis/PathSensitive/GRState.h"
|
||||
#include "llvm/ADT/ImmutableMap.h"
|
||||
#include "llvm/Support/Compiler.h"
|
||||
|
@ -61,7 +62,7 @@ public:
|
|||
|
||||
Store BindInternal(Store St, Loc loc, SVal V);
|
||||
Store Remove(Store St, Loc loc);
|
||||
Store getInitialStore();
|
||||
Store getInitialStore(const LocationContext *InitLoc);
|
||||
|
||||
// FIXME: Investigate what is using this. This method should be removed.
|
||||
virtual Loc getLoc(const VarDecl* VD) {
|
||||
|
@ -488,12 +489,12 @@ Store BasicStoreManager::scanForIvars(Stmt *B, const Decl* SelfDecl, Store St) {
|
|||
return St;
|
||||
}
|
||||
|
||||
Store BasicStoreManager::getInitialStore() {
|
||||
Store BasicStoreManager::getInitialStore(const LocationContext *InitLoc) {
|
||||
// The LiveVariables information already has a compilation of all VarDecls
|
||||
// used in the function. Iterate through this set, and "symbolicate"
|
||||
// any VarDecl whose value originally comes from outside the function.
|
||||
typedef LiveVariables::AnalysisDataTy LVDataTy;
|
||||
LVDataTy& D = StateMgr.getLiveVariables().getAnalysisData();
|
||||
LVDataTy& D = InitLoc->getLiveVariables()->getAnalysisData();
|
||||
Store St = VBFactory.GetEmptyMap().getRoot();
|
||||
|
||||
for (LVDataTy::decl_iterator I=D.begin_decl(), E=D.end_decl(); I != E; ++I) {
|
||||
|
|
|
@ -170,7 +170,7 @@ bool GRCoreEngine::ExecuteWorkList(const LocationContext *L, unsigned Steps) {
|
|||
WList->setBlockCounter(BCounterFactory.GetEmptyCounter());
|
||||
|
||||
// Generate the root.
|
||||
GenerateNode(StartLoc, getInitialState(), 0);
|
||||
GenerateNode(StartLoc, getInitialState(L), 0);
|
||||
}
|
||||
|
||||
while (Steps && WList->hasWork()) {
|
||||
|
|
|
@ -202,8 +202,8 @@ void GRExprEngine::AddCheck(GRSimpleAPICheck *A) {
|
|||
((MappedBatchAuditor*) BatchAuditor.get())->AddCheck(A);
|
||||
}
|
||||
|
||||
const GRState* GRExprEngine::getInitialState() {
|
||||
const GRState *state = StateMgr.getInitialState();
|
||||
const GRState* GRExprEngine::getInitialState(const LocationContext *InitLoc) {
|
||||
const GRState *state = StateMgr.getInitialState(InitLoc);
|
||||
|
||||
// Precondition: the first argument of 'main' is an integer guaranteed
|
||||
// to be > 0.
|
||||
|
|
|
@ -115,12 +115,12 @@ const GRState *GRState::bindExpr(const Stmt* Ex, SVal V,
|
|||
return bindExpr(Ex, V, isBlkExpr, Invalidate);
|
||||
}
|
||||
|
||||
const GRState* GRStateManager::getInitialState() {
|
||||
GRState StateImpl(this, EnvMgr.getInitialEnvironment(),
|
||||
StoreMgr->getInitialStore(),
|
||||
GDMFactory.GetEmptyMap());
|
||||
const GRState* GRStateManager::getInitialState(const LocationContext *InitLoc) {
|
||||
GRState State(this, EnvMgr.getInitialEnvironment(),
|
||||
StoreMgr->getInitialStore(InitLoc),
|
||||
GDMFactory.GetEmptyMap());
|
||||
|
||||
return getPersistentState(StateImpl);
|
||||
return getPersistentState(State);
|
||||
}
|
||||
|
||||
const GRState* GRStateManager::getPersistentState(GRState& State) {
|
||||
|
|
|
@ -231,7 +231,9 @@ public:
|
|||
SVal EvalBinOp(const GRState *state, BinaryOperator::Opcode Op,Loc L,
|
||||
NonLoc R, QualType resultTy);
|
||||
|
||||
Store getInitialStore() { return RBFactory.GetEmptyMap().getRoot(); }
|
||||
Store getInitialStore(const LocationContext *InitLoc) {
|
||||
return RBFactory.GetEmptyMap().getRoot();
|
||||
}
|
||||
|
||||
/// getSelfRegion - Returns the region for the 'self' (Objective-C) or
|
||||
/// 'this' object (C++). When used when analyzing a normal function this
|
||||
|
|
Loading…
Reference in New Issue