Static Value-Flow Analysis
Loading...
Searching...
No Matches
Public Types | Public Member Functions | Private Attributes | List of all members
SVF::CFLAlias Class Reference

#include <CFLAlias.h>

Inheritance diagram for SVF::CFLAlias:
SVF::CFLBase SVF::BVDataPTAImpl SVF::PointerAnalysis SVF::POCRAlias SVF::POCRHybrid

Public Types

typedef OrderedMap< const CallICFGNode *, NodeIDCallSite2DummyValPN
 
- Public Types inherited from SVF::BVDataPTAImpl
typedef PTData< NodeID, NodeSet, NodeID, PointsToPTDataTy
 
typedef DiffPTData< NodeID, NodeSet, NodeID, PointsToDiffPTDataTy
 
typedef DFPTData< NodeID, NodeSet, NodeID, PointsToDFPTDataTy
 
typedef VersionedPTData< NodeID, NodeSet, NodeID, PointsTo, VersionedVar, Set< VersionedVar > > VersionedPTDataTy
 
typedef MutablePTData< NodeID, NodeSet, NodeID, PointsToMutPTDataTy
 
typedef MutableDiffPTData< NodeID, NodeSet, NodeID, PointsToMutDiffPTDataTy
 
typedef MutableDFPTData< NodeID, NodeSet, NodeID, PointsToMutDFPTDataTy
 
typedef MutableIncDFPTData< NodeID, NodeSet, NodeID, PointsToMutIncDFPTDataTy
 
typedef MutableVersionedPTData< NodeID, NodeSet, NodeID, PointsTo, VersionedVar, Set< VersionedVar > > MutVersionedPTDataTy
 
typedef PersistentPTData< NodeID, NodeSet, NodeID, PointsToPersPTDataTy
 
typedef PersistentDiffPTData< NodeID, NodeSet, NodeID, PointsToPersDiffPTDataTy
 
typedef PersistentDFPTData< NodeID, NodeSet, NodeID, PointsToPersDFPTDataTy
 
typedef PersistentIncDFPTData< NodeID, NodeSet, NodeID, PointsToPersIncDFPTDataTy
 
typedef PersistentVersionedPTData< NodeID, NodeSet, NodeID, PointsTo, VersionedVar, Set< VersionedVar > > PersVersionedPTDataTy
 
- Public Types inherited from SVF::PointerAnalysis
typedef Set< const CallICFGNode * > CallSiteSet
 Indirect call edges type, map a callsite to a set of callees.
 
typedef SVFIR::CallSiteToFunPtrMap CallSiteToFunPtrMap
 
typedef Set< const FunObjVar * > FunctionSet
 
typedef OrderedMap< const CallICFGNode *, FunctionSetCallEdgeMap
 
typedef SCCDetection< CallGraph * > CallGraphSCC
 
typedef Set< const GlobalObjVar * > VTableSet
 
typedef Set< const FunObjVar * > VFunSet
 

Public Member Functions

 CFLAlias (SVFIR *ir)
 
virtual void initialize ()
 Initialize the grammar, graph, solver.
 
virtual void initializeSolver ()
 Initialize Solver.
 
virtual void finalize ()
 Print grammar and graph.
 
virtual void solve ()
 Solving CFL Reachability.
 
virtual AliasResult alias (NodeID node1, NodeID node2)
 Interface exposed to users of our Alias analysis, given PAGNodeID.
 
virtual const PointsTogetCFLPts (NodeID ptr)
 Get points-to targets of a pointer. V In this context.
 
virtual bool addCopyEdge (NodeID src, NodeID dst)
 Need Original one for virtual table.
 
virtual const NodeSetgetRevPts (NodeID nodeId)
 Given an object, get all the nodes having whose pointsto contains the object.
 
virtual bool updateCallGraph (const CallSiteToFunPtrMap &callsites)
 Update call graph for the input indirect callsites.
 
virtual void onTheFlyCallGraphSolve (const CallSiteToFunPtrMap &callsites, CallEdgeMap &newEdges)
 On the fly call graph construction.
 
void connectCaller2CalleeParams (const CallICFGNode *cs, const FunObjVar *F)
 Connect formal and actual parameters for indirect callsites.
 
void heapAllocatorViaIndCall (const CallICFGNode *cs)
 
- Public Member Functions inherited from SVF::CFLBase
 CFLBase (SVFIR *ir, PTATY pty)
 
virtual ~CFLBase ()
 Destructor.
 
virtual void checkParameter ()
 Parameter Checking.
 
virtual void buildCFLGrammar ()
 Build Grammar from text file.
 
virtual void buildCFLGraph ()
 Build CFLGraph based on Option.
 
virtual void normalizeCFLGrammar ()
 Normalize grammar.
 
CFLGraphgetCFLGraph ()
 Get CFL graph.
 
virtual void countSumEdges ()
 Count the num of Nonterminal Edges.
 
virtual void analyze ()
 Perform analyze (main part of CFLR Analysis)
 
- Public Member Functions inherited from SVF::BVDataPTAImpl
 BVDataPTAImpl (SVFIR *pag, PTATY type, bool alias_check=true)
 Constructor.
 
 ~BVDataPTAImpl () override=default
 Destructor.
 
PersistentPointsToCache< PointsTo > & getPtCache ()
 
const PointsTogetPts (NodeID id) override
 
virtual void clearPts (NodeID id, NodeID element)
 Remove element from the points-to set of id.
 
virtual void clearFullPts (NodeID id)
 Clear points-to set of id.
 
virtual bool unionPts (NodeID id, const PointsTo &target)
 
virtual bool unionPts (NodeID id, NodeID ptd)
 
virtual bool addPts (NodeID id, NodeID ptd)
 
virtual void clearAllPts ()
 Clear all data.
 
virtual void expandFIObjs (const PointsTo &pts, PointsTo &expandedPts)
 Expand FI objects.
 
virtual void expandFIObjs (const NodeBS &pts, NodeBS &expandedPts)
 TODO: remove repetition.
 
void remapPointsToSets (void)
 Remap all points-to sets to use the current mapping.
 
virtual void writeToFile (const std::string &filename)
 Interface for analysis result storage on filesystem.
 
virtual void writeObjVarToFile (const std::string &filename)
 
virtual void writePtsResultToFile (std::fstream &f)
 
virtual void writeGepObjVarMapToFile (std::fstream &f)
 
virtual bool readFromFile (const std::string &filename)
 
virtual void readPtsResultFromFile (std::ifstream &f)
 
virtual void readGepObjVarMapFromFile (std::ifstream &f)
 
virtual void readAndSetObjFieldSensitivity (std::ifstream &f, const std::string &delimiterStr)
 
AliasResult alias (const SVFVar *V1, const SVFVar *V2) override
 Interface expose to users of our pointer analysis, given Value infos.
 
virtual AliasResult alias (const PointsTo &pts1, const PointsTo &pts2)
 Interface expose to users of our pointer analysis, given two pts.
 
bool mayAlias (const PointsTo &pts1, const PointsTo &pts2)
 Convenience bool wrappers: return true if the two operands may/must/partial alias.
 
void dumpCPts () override
 dump and debug, print out conditional pts
 
void dumpTopLevelPtsTo () override
 
void dumpAllPts () override
 
- Public Member Functions inherited from SVF::PointerAnalysis
ICFGgetICFG () const
 Get ICFG.
 
u32_t getNumOfResolvedIndCallEdge () const
 Return number of resolved indirect call edges.
 
CallGraphgetCallGraph () const
 Return call graph.
 
CallGraphSCCgetCallGraphSCC () const
 Return call graph SCC.
 
 PointerAnalysis (SVFIR *pag, PTATY ty=PTATY::Default_PTA, bool alias_check=true)
 Constructor.
 
PTATY getAnalysisTy () const
 Type of pointer analysis.
 
PTAImplTy getImplTy () const
 Return implementation type of the pointer analysis.
 
bool printStat ()
 Whether print statistics.
 
void disablePrintStat ()
 Whether print statistics.
 
CallEdgeMapgetIndCallMap ()
 Get callees from an indirect callsite.
 
bool hasIndCSCallees (const CallICFGNode *cs) const
 
const FunctionSetgetIndCSCallees (const CallICFGNode *cs) const
 
virtual void resolveIndCalls (const CallICFGNode *cs, const PointsTo &target, CallEdgeMap &newEdges)
 Resolve indirect call edges.
 
void callGraphSCCDetection ()
 PTACallGraph SCC related methods.
 
NodeID getCallGraphSCCRepNode (NodeID id) const
 Get SCC rep node of a SVFG node.
 
bool inSameCallGraphSCC (const FunObjVar *fun1, const FunObjVar *fun2)
 Return TRUE if this edge is inside a PTACallGraph SCC, i.e., src node and dst node are in the same SCC on the SVFG.
 
bool isInRecursion (const FunObjVar *fun) const
 
bool isLocalVarInRecursiveFun (NodeID id) const
 Whether a local variable is in function recursions.
 
virtual const std::string PTAName () const
 Return PTA name.
 
CommonCHGraphgetCHGraph () const
 get CHGraph
 
void getVFnsFromCHA (const CallICFGNode *cs, VFunSet &vfns)
 
void getVFnsFromPts (const CallICFGNode *cs, const PointsTo &target, VFunSet &vfns)
 
void connectVCallToVFns (const CallICFGNode *cs, const VFunSet &vfns, CallEdgeMap &newEdges)
 
virtual void resolveCPPIndCalls (const CallICFGNode *cs, const PointsTo &target, CallEdgeMap &newEdges)
 Resolve cpp indirect call edges.
 
SVFIRgetPAG () const
 
PTAStatgetStat () const
 Get PTA stat.
 
OrderedNodeSetgetAllValidPtrs ()
 Get all Valid Pointers for resolution.
 
virtual void computeDDAPts (NodeID)
 Compute points-to results on-demand, overridden by derived classes.
 
bool mayAlias (const SVFVar *V1, const SVFVar *V2)
 Convenience bool wrappers: return true if the two operands may/must/partial alias.
 
bool mayAlias (NodeID node1, NodeID node2)
 
void printIndCSTargets (const CallICFGNode *cs, const FunctionSet &targets)
 Print targets of a function pointer.
 
virtual void dumpPts (NodeID ptr, const PointsTo &pts)
 
void printIndCSTargets ()
 
void dumpAllTypes ()
 
void dumpStat ()
 Dump the statistics.
 
bool containBlackHoleNode (const PointsTo &pts)
 Determine whether a points-to contains a black hole or constant node.
 
bool containConstantNode (const PointsTo &pts)
 
virtual bool isBlkObjOrConstantObj (NodeID ptd) const
 
bool isHeapMemObj (NodeID id) const
 Whether this object is heap or array.
 
bool isArrayMemObj (NodeID id) const
 
bool isFIObjNode (NodeID id) const
 
NodeID getBaseObjVarID (NodeID id)
 
NodeID getFIObjVar (NodeID id)
 
NodeID getGepObjVar (NodeID id, const APOffset &ap)
 
virtual const NodeBSgetAllFieldsObjVars (NodeID id)
 
void setObjFieldInsensitive (NodeID id)
 
bool isFieldInsensitive (NodeID id) const
 

Private Attributes

CallSite2DummyValPN callsite2DummyValPN
 Map an instruction to a dummy obj which created at an indirect callsite, which invokes a heap allocator.
 

Additional Inherited Members

- Static Public Member Functions inherited from SVF::BVDataPTAImpl
static bool classof (const PointerAnalysis *pta)
 
- Static Public Attributes inherited from SVF::CFLBase
static double timeOfBuildCFLGrammar = 0
 Statistics.
 
static double timeOfNormalizeGrammar = 0
 
static double timeOfBuildCFLGraph = 0
 
static double numOfTerminalEdges = 0
 
static double numOfTemporaryNonterminalEdges = 0
 
static double numOfNonterminalEdges = 0
 
static double numOfStartEdges = 0
 
static double numOfIteration = 1
 
static double numOfChecks = 1
 
static double timeOfSolving = 0
 
- Static Public Attributes inherited from SVF::PointerAnalysis
static const std::string aliasTestMayAlias = "MAYALIAS"
 
static const std::string aliasTestMayAliasMangled = "_Z8MAYALIASPvS_"
 
static const std::string aliasTestNoAlias = "NOALIAS"
 
static const std::string aliasTestNoAliasMangled = "_Z7NOALIASPvS_"
 
static const std::string aliasTestPartialAlias = "PARTIALALIAS"
 
static const std::string aliasTestPartialAliasMangled = "_Z12PARTIALALIASPvS_"
 
static const std::string aliasTestMustAlias = "MUSTALIAS"
 
static const std::string aliasTestMustAliasMangled = "_Z9MUSTALIASPvS_"
 
static const std::string aliasTestFailMayAlias = "EXPECTEDFAIL_MAYALIAS"
 
static const std::string aliasTestFailMayAliasMangled = "_Z21EXPECTEDFAIL_MAYALIASPvS_"
 
static const std::string aliasTestFailNoAlias = "EXPECTEDFAIL_NOALIAS"
 
static const std::string aliasTestFailNoAliasMangled = "_Z20EXPECTEDFAIL_NOALIASPvS_"
 
- Protected Member Functions inherited from SVF::BVDataPTAImpl
PTDataTygetPTDataTy () const
 Get points-to data structure.
 
DiffPTDataTygetDiffPTDataTy () const
 
DFPTDataTygetDFPTDataTy () const
 
MutDFPTDataTygetMutDFPTDataTy () const
 
VersionedPTDataTygetVersionedPTDataTy () const
 
virtual void onTheFlyThreadCallGraphSolve (const CallSiteToFunPtrMap &callsites, CallEdgeMap &newForkEdges)
 On the fly thread call graph construction respecting forksite.
 
virtual void normalizePointsTo ()
 
- Protected Member Functions inherited from SVF::PointerAnalysis
const CallSiteToFunPtrMapgetIndirectCallsites () const
 Return all indirect callsites.
 
NodeID getFunPtr (const CallICFGNode *cs) const
 Return function pointer PAGNode at a callsite cs.
 
virtual void validateTests ()
 Alias check functions to verify correctness of pointer analysis.
 
virtual void validateSuccessTests (std::string fun)
 
virtual void validateExpectedFailureTests (std::string fun)
 
void resetObjFieldSensitive ()
 Reset all object node as field-sensitive.
 
- Protected Attributes inherited from SVF::CFLBase
SVFIRsvfir
 
CFLGraphgraph
 
GrammarBasegrammarBase
 
CFGrammargrammar
 
CFLSolversolver
 
- Protected Attributes inherited from SVF::PointerAnalysis
bool print_stat
 User input flags.
 
bool alias_validation
 Flag for validating points-to/alias results.
 
u32_t OnTheFlyIterBudgetForStat
 Flag for iteration budget for on-the-fly statistics.
 
PTATY ptaTy
 Pointer analysis Type.
 
PTAImplTy ptaImplTy
 PTA implementation type.
 
PTAStatstat
 Statistics.
 
CallGraphcallgraph
 Call graph used for pointer analysis.
 
CallGraphSCCcallGraphSCC
 SCC for PTACallGraph.
 
ICFGicfg
 Interprocedural control-flow graph.
 
CommonCHGraphchgraph
 CHGraph.
 
- Static Protected Attributes inherited from SVF::PointerAnalysis
static SVFIRpag = nullptr
 SVFIR.
 

Detailed Description

Definition at line 42 of file CFLAlias.h.

Member Typedef Documentation

◆ CallSite2DummyValPN

Definition at line 46 of file CFLAlias.h.

Constructor & Destructor Documentation

◆ CFLAlias()

SVF::CFLAlias::CFLAlias ( SVFIR ir)
inline

Definition at line 48 of file CFLAlias.h.

49 {
50 }
CFLBase(SVFIR *ir, PTATY pty)
Definition CFLBase.h:50
@ CFLFICI_WPA
Flow-, context-, insensitive CFL-reachability-based analysis.
Definition PTATY.h:23
llvm::IRBuilder IRBuilder
Definition BasicTypes.h:76

Member Function Documentation

◆ addCopyEdge()

virtual bool SVF::CFLAlias::addCopyEdge ( NodeID  src,
NodeID  dst 
)
inlinevirtual

Need Original one for virtual table.

Add copy edge on constraint graph

Definition at line 111 of file CFLAlias.h.

112 {
113 const CFLEdge *edge = graph->hasEdge(graph->getGNode(src),graph->getGNode(dst), 1);
114 if (edge != nullptr )
115 {
116 return false;
117 }
118 CFGrammar::Kind copyKind = grammar->strToKind("copy");
122 return true;
123 }
CFLSolver * solver
Definition CFLBase.h:110
CFLGraph * graph
Definition CFLBase.h:107
CFGrammar * grammar
Definition CFLBase.h:109
virtual const CFLEdge * addCFLEdge(CFLNode *src, CFLNode *dst, CFLEdge::GEdgeFlag label)
Definition CFLGraph.cpp:47
virtual const CFLEdge * hasEdge(CFLNode *src, CFLNode *dst, CFLEdge::GEdgeFlag label)
Definition CFLGraph.cpp:63
virtual bool pushIntoWorklist(const CFLEdge *item)
Definition CFLSolver.h:85
NodeType * getGNode(NodeID id) const
Get a node.
Kind strToKind(std::string str) const
Definition CFGrammar.cpp:57

◆ alias()

virtual AliasResult SVF::CFLAlias::alias ( NodeID  node1,
NodeID  node2 
)
inlinevirtual

Interface exposed to users of our Alias analysis, given PAGNodeID.

Reimplemented from SVF::BVDataPTAImpl.

Definition at line 66 of file CFLAlias.h.

67 {
70 else
72 }
@ MayAlias
Definition SVFType.h:621
@ NoAlias
Definition SVFType.h:620

◆ connectCaller2CalleeParams()

void CFLAlias::connectCaller2CalleeParams ( const CallICFGNode cs,
const FunObjVar F 
)

Connect formal and actual parameters for indirect callsites.

Connect formal and actual parameters for indirect callsites

Definition at line 64 of file CFLAlias.cpp.

65{
66 assert(F);
67
68 DBOUT(DAndersen, outs() << "connect parameters from indirect callsite " << cs->toString() << " to callee " << *F << "\n");
69
70 const CallICFGNode* callBlockNode = cs;
72
74 {
76 }
77
79 {
81 const PAGNode* fun_return = svfir->getFunRet(F);
82 if (cs_return->isPointer() && fun_return->isPointer())
83 {
85 NodeID srcret = fun_return->getId();
87 }
88 else
89 {
90 DBOUT(DAndersen, outs() << "not a pointer ignored\n");
91 }
92 }
93
94 if (svfir->hasCallSiteArgsMap(callBlockNode) && svfir->hasFunArgsList(F))
95 {
96
97 // connect actual and formal param
100 //Go through the fixed parameters.
101 DBOUT(DPAGBuild, outs() << " args:");
102 SVFIR::ValVarList::const_iterator funArgIt = funArgList.begin(), funArgEit = funArgList.end();
103 SVFIR::ValVarList::const_iterator csArgIt = csArgList.begin(), csArgEit = csArgList.end();
104 for (; funArgIt != funArgEit; ++csArgIt, ++funArgIt)
105 {
106 //Some programs (e.g. Linux kernel) leave unneeded parameters empty.
107 if (csArgIt == csArgEit)
108 {
109 DBOUT(DAndersen, outs() << " !! not enough args\n");
110 break;
111 }
112 const PAGNode *cs_arg = *csArgIt ;
113 const PAGNode *fun_arg = *funArgIt;
114
115 if (cs_arg->isPointer() && fun_arg->isPointer())
116 {
117 DBOUT(DAndersen, outs() << "process actual parm " << cs_arg->toString() << " \n");
118 NodeID srcAA = cs_arg->getId();
119 NodeID dstFA = fun_arg->getId();
121 }
122 }
123
124 //Any remaining actual args must be varargs.
125 if (F->isVarArg())
126 {
128 DBOUT(DPAGBuild, outs() << "\n varargs:");
129 for (; csArgIt != csArgEit; ++csArgIt)
130 {
131 const PAGNode *cs_arg = *csArgIt;
132 if (cs_arg->isPointer())
133 {
134 NodeID vnAA = cs_arg->getId();
136 }
137 }
138 }
139 if(csArgIt != csArgEit)
140 {
141 writeWrnMsg("too many args to non-vararg func.");
142 writeWrnMsg("(" + cs->getSourceLoc() + ")");
143 }
144 }
145}
#define DBOUT(TYPE, X)
LLVM debug macros, define type of your DBUG model of each pass.
Definition SVFType.h:576
#define DPAGBuild
Definition SVFType.h:584
#define DAndersen
Definition SVFType.h:595
virtual bool addCopyEdge(NodeID src, NodeID dst)
Need Original one for virtual table.
Definition CFLAlias.h:111
void heapAllocatorViaIndCall(const CallICFGNode *cs)
Definition CFLAlias.cpp:147
SVFIR * svfir
Definition CFLBase.h:106
const std::string toString() const override
Definition ICFG.cpp:129
const RetICFGNode * getRetICFGNode() const
Return callsite.
Definition ICFGNode.h:440
const std::string getSourceLoc() const override
Definition ICFGNode.h:571
bool isVarArg() const
NodeID getVarargNode(const FunObjVar *func) const
getVarargNode - Return the unique node representing the variadic argument of a variadic function.
Definition IRGraph.cpp:71
bool funHasRet(const FunObjVar *func) const
Definition SVFIR.h:429
bool hasFunArgsList(const FunObjVar *func) const
Function has arguments list.
Definition SVFIR.h:368
const ValVar * getCallSiteRet(const RetICFGNode *cs) const
Get callsite return.
Definition SVFIR.h:407
const ValVarList & getFunArgsList(const FunObjVar *func) const
Get function arguments list.
Definition SVFIR.h:378
std::vector< const ValVar * > ValVarList
Definition SVFIR.h:60
bool hasCallSiteArgsMap(const CallICFGNode *cs) const
Callsite has argument list.
Definition SVFIR.h:385
bool callsiteHasRet(const RetICFGNode *cs) const
Definition SVFIR.h:413
const ValVar * getFunRet(const FunObjVar *func) const
Get function return list.
Definition SVFIR.h:423
const ValVarList & getCallSiteArgsList(const CallICFGNode *cs) const
Get callsite argument list.
Definition SVFIR.h:395
NodeID getId() const
Get ID.
Definition SVFValue.h:160
bool isHeapAllocExtFunViaRet(const FunObjVar *fun)
Return true if the call is a heap allocator/reallocator.
Definition SVFUtil.h:279
void writeWrnMsg(const std::string &msg)
Writes a message run through wrnMsg.
Definition SVFUtil.cpp:72
std::ostream & outs()
Overwrite llvm::outs()
Definition SVFUtil.h:52
u32_t NodeID
Definition GeneralType.h:76

◆ finalize()

void CFLAlias::finalize ( )
virtual

Print grammar and graph.

Reimplemented from SVF::CFLBase.

Definition at line 215 of file CFLAlias.cpp.

216{
218
219 if(Options::PrintCFL() == true)
220 {
221 if (Options::CFLGraph().empty())
222 svfir->dump("IR");
223 grammar->dump("Grammar");
224 graph->dump("CFLGraph");
225 }
226 if (Options::CFLGraph().empty())
228}
void dump() const
static double numOfChecks
Definition CFLBase.h:101
void dump(const std::string &filename)
Definition CFLGraph.cpp:73
static double numOfChecks
Definition CFLSolver.h:53
void dump(std::string name)
Dump SVFIR.
Definition IRGraph.cpp:320
static const Option< std::string > CFLGraph
Definition Options.h:225
static const Option< bool > PrintCFL
Definition Options.h:226
virtual void finalize()
Finalization of a pointer analysis, including checking alias correctness.

◆ getCFLPts()

virtual const PointsTo & SVF::CFLAlias::getCFLPts ( NodeID  ptr)
inlinevirtual

Get points-to targets of a pointer. V In this context.

Check V Dst of ptr.

Definition at line 75 of file CFLAlias.h.

76 {
78 CFLNode *funNode = graph->getGNode(ptr);
79 for(auto outedge = funNode->getOutEdges().begin(); outedge!=funNode->getOutEdges().end(); outedge++)
80 {
81 if((*outedge)->getEdgeKind() == graph->getStartKind())
82 {
83 // Need to Find dst addr src
84 SVFVar *vNode = svfir->getGNode((*outedge)->getDstID());
86 // Remove svfir->getBaseValVar, SVF IR api change
87 if (vNode->hasIncomingEdges(SVFStmt::Gep))
88 {
90 SVFVar::iterator it = geps.begin();
91 basevNodeID = (*it)->getSrcID();
92 }
93 else
94 basevNodeID = vNode->getId();
96 for(auto inEdge = vNode->getInEdges().begin(); inEdge!=vNode->getInEdges().end(); inEdge++)
97 {
98 if((*inEdge)->getEdgeKind() == 0)
99 {
100 addPts(ptr, (*inEdge)->getSrcID());
101 }
102 }
103 }
104 }
105 return getPts(ptr);
106 }
const PointsTo & getPts(NodeID id) override
virtual bool addPts(NodeID id, NodeID ptd)
Kind getStartKind() const
Definition CFLGraph.cpp:37
GEdgeSetTy::iterator iterator
GenericNode< SVFVar, SVFStmt >::GEdgeSetTy SVFStmtSetTy
SVFStmt::SVFStmtSetTy & getIncomingEdges(SVFStmt::PEDGEK kind)
Edge accessors and checkers.

◆ getRevPts()

virtual const NodeSet & SVF::CFLAlias::getRevPts ( NodeID  nodeId)
inlinevirtual

Given an object, get all the nodes having whose pointsto contains the object.

Check Outgoing flowtobar edge dst of ptr

Reimplemented from SVF::BVDataPTAImpl.

Definition at line 126 of file CFLAlias.h.

127 {
129 abort(); // to be implemented
130 }

◆ heapAllocatorViaIndCall()

void CFLAlias::heapAllocatorViaIndCall ( const CallICFGNode cs)

Definition at line 147 of file CFLAlias.cpp.

148{
149 assert(cs->getCalledFunction() == nullptr && "not an indirect callsite?");
153 CallSite2DummyValPN::const_iterator it = callsite2DummyValPN.find(cs);
154 if(it != callsite2DummyValPN.end())
155 {
156 srcret = it->second;
157 }
158 else
159 {
162 callsite2DummyValPN.insert(std::make_pair(cs,valNode));
165 srcret = valNode;
166 }
167
168 NodeID dstrec = cs_return->getId();
170}
CallSite2DummyValPN callsite2DummyValPN
Map an instruction to a dummy obj which created at an indirect callsite, which invokes a heap allocat...
Definition CFLAlias.h:144
virtual void addCFLNode(NodeID id, CFLNode *node)
Definition CFLGraph.cpp:42
const FunObjVar * getCalledFunction() const
Definition ICFGNode.h:501
NodeID addDummyValNode()
Definition SVFIR.h:566
NodeID addDummyObjNode(const SVFType *type)
Definition SVFIR.h:570
virtual const SVFType * getType() const
Definition SVFValue.h:171

◆ initialize()

void CFLAlias::initialize ( )
virtual

Initialize the grammar, graph, solver.

Reimplemented from SVF::PointerAnalysis.

Definition at line 190 of file CFLAlias.cpp.

191{
192 stat = new CFLStat(this);
193
194 // Parameter Checking
196
197 // Build CFL Grammar
199
200 // Build CFL Graph
202
203 // Normalize CFL Grammar
205
206 // Initialize solver
208}
virtual void initializeSolver()
Initialize Solver.
Definition CFLAlias.cpp:210
virtual void buildCFLGraph()
Build CFLGraph based on Option.
Definition CFLBase.cpp:84
virtual void normalizeCFLGrammar()
Normalize grammar.
Definition CFLBase.cpp:111
virtual void checkParameter()
Parameter Checking.
Definition CFLBase.cpp:55
virtual void buildCFLGrammar()
Build Grammar from text file.
Definition CFLBase.cpp:71
PTAStat * stat
Statistics.

◆ initializeSolver()

void CFLAlias::initializeSolver ( )
virtual

Initialize Solver.

Reimplemented in SVF::POCRAlias, and SVF::POCRHybrid.

Definition at line 210 of file CFLAlias.cpp.

211{
213}

◆ onTheFlyCallGraphSolve()

void CFLAlias::onTheFlyCallGraphSolve ( const CallSiteToFunPtrMap callsites,
CallEdgeMap newEdges 
)
virtual

On the fly call graph construction.

On the fly call graph construction callsites is candidate indirect callsites need to be analyzed based on points-to results newEdges is the new indirect call edges discovered

Reimplemented from SVF::BVDataPTAImpl.

Definition at line 41 of file CFLAlias.cpp.

42{
43 for(CallSiteToFunPtrMap::const_iterator iter = callsites.begin(), eiter = callsites.end(); iter!=eiter; ++iter)
44 {
45 const CallICFGNode* cs = iter->first;
46
47 if (cs->isVirtualCall())
48 {
49 const SVFVar* vtbl = cs->getVtablePtr();
50
51 assert(vtbl != nullptr);
52 NodeID vtblId = vtbl->getId();
54 }
55 else
57 }
58}
virtual const PointsTo & getCFLPts(NodeID ptr)
Get points-to targets of a pointer. V In this context.
Definition CFLAlias.h:75
const SVFVar * getVtablePtr() const
Definition ICFGNode.h:520
bool isVirtualCall() const
Definition ICFGNode.h:510
virtual void resolveIndCalls(const CallICFGNode *cs, const PointsTo &target, CallEdgeMap &newEdges)
Resolve indirect call edges.
virtual void resolveCPPIndCalls(const CallICFGNode *cs, const PointsTo &target, CallEdgeMap &newEdges)
Resolve cpp indirect call edges.

◆ solve()

void CFLAlias::solve ( )
virtual

Solving CFL Reachability.

Reimplemented from SVF::CFLBase.

Definition at line 230 of file CFLAlias.cpp.

231{
232 // Start solving
233 double start = stat->getClk(true);
234
235 solver->solve();
236 if (Options::CFLGraph().empty())
237 {
239 {
241 solver->solve();
242 }
243 } // Only cflgraph built from bc could reanalyze by update call graph
244
245 double end = stat->getClk(true);
246 timeOfSolving += (end - start) / TIMEINTERVAL;
247}
#define TIMEINTERVAL
Definition SVFType.h:604
virtual bool updateCallGraph(const CallSiteToFunPtrMap &callsites)
Update call graph for the input indirect callsites.
Definition CFLAlias.cpp:175
static double timeOfSolving
Definition CFLBase.h:102
static double numOfIteration
Definition CFLBase.h:100
virtual void solve()
Start solving.
const CallSiteToFunPtrMap & getIndirectCallsites() const
Add/get indirect callsites.
Definition SVFIR.h:453
static double getClk(bool mark=false)
Definition SVFStat.cpp:51

◆ updateCallGraph()

bool CFLAlias::updateCallGraph ( const CallSiteToFunPtrMap callsites)
virtual

Update call graph for the input indirect callsites.

Update call graph for the input indirect callsites

Reimplemented from SVF::BVDataPTAImpl.

Definition at line 175 of file CFLAlias.cpp.

176{
179 for(CallEdgeMap::iterator it = newEdges.begin(), eit = newEdges.end(); it!=eit; ++it )
180 {
181 for(FunctionSet::iterator cit = it->second.begin(), ecit = it->second.end(); cit!=ecit; ++cit)
182 {
184 }
185 }
186
187 return (!solver->isWorklistEmpty());
188}
void connectCaller2CalleeParams(const CallICFGNode *cs, const FunObjVar *F)
Connect formal and actual parameters for indirect callsites.
Definition CFLAlias.cpp:64
virtual void onTheFlyCallGraphSolve(const CallSiteToFunPtrMap &callsites, CallEdgeMap &newEdges)
On the fly call graph construction.
Definition CFLAlias.cpp:41
virtual bool isWorklistEmpty()
Definition CFLSolver.h:89
OrderedMap< const CallICFGNode *, FunctionSet > CallEdgeMap

Member Data Documentation

◆ callsite2DummyValPN

CallSite2DummyValPN SVF::CFLAlias::callsite2DummyValPN
private

Map an instruction to a dummy obj which created at an indirect callsite, which invokes a heap allocator.

Definition at line 144 of file CFLAlias.h.


The documentation for this class was generated from the following files: