33using namespace SVFUtil;
51 while(!worklist.empty())
53 const SVFGNode* node = worklist.pop();
70 if(
edge->isCallVFGEdge())
74 else if(
edge->isRetVFGEdge())
87 ") --> " <<
"succ (" <<
succ->getId() <<
") condition: " <<
getVFCond(
succ) <<
"\n");
181 assert(
edge->isCallVFGEdge() &&
"not a call svfg edge?");
189 assert(
edge->isRetVFGEdge() &&
"not a return svfg edge?");
#define DBOUT(TYPE, X)
LLVM debug macros, define type of your DBUG model of each pass.
std::vector< SVFBugEvent > EventStack
iterator OutEdgeBegin()
iterators
Condition finalCond
final condition
bool inBackwardSlice(const SVFGNode *node)
const CallICFGNode * getRetSite(const SVFGEdge *edge) const
Condition condNeg(const Condition &cond)
const SVFBasicBlock * getSVFGNodeBB(const SVFGNode *node) const
void evalFinalCond2Event(GenericBug::EventStack &eventStack) const
Add final condition to eventStack.
SVFGNodeSetIter sinksEnd() const
const SVFGNodeToSVFGNodeSetMap & getRemovedSUVFEdges() const
Condition condOr(const Condition &lhs, const Condition &rhs)
bool isSatisfiableForPairs()
Condition getTrueCond() const
bool isSatisfiableForAll()
const SVFG * getSVFG() const
FIFOWorkList< const SVFGNode * > VFWorkList
worklist for value-flow guard computation
bool isEquivalentBranchCond(const Condition &lhs, const Condition &rhs) const
Condition ComputeInterCallVFGGuard(const SVFBasicBlock *src, const SVFBasicBlock *dst, const SVFBasicBlock *callBB)
void destroy()
Release memory.
const CallICFGNode * getCallSite(const SVFGEdge *edge) const
Get callsite ID and get returnsiteID from SVFGEdge.
Condition getFalseCond() const
const SVFGNode * getSource() const
root and sink operations
bool AllPathReachableSolve()
Guarded reachability solve.
SaberCondAllocator * pathAllocator
path condition allocator
void clearCFCond()
Clear Control flow conditions before each VF computation.
bool setVFCond(const SVFGNode *node, const Condition &cond)
Condition ComputeInterRetVFGGuard(const SVFBasicBlock *src, const SVFBasicBlock *dst, const SVFBasicBlock *retBB)
Condition computeInvalidCondFromRemovedSUVFEdge(const SVFGNode *cur)
Compute invalid branch condition stemming from removed strong update value-flow edges.
Condition condAnd(const Condition &lhs, const Condition &rhs)
Condition operations.
SVFGNodeSetIter sinksBegin() const
Condition ComputeIntraVFGGuard(const SVFBasicBlock *src, const SVFBasicBlock *dst)
Compute guards for value-flows.
Condition getVFCond(const SVFGNode *node) const
Get/set VF (value-flow) and CF (control-flow) conditions.
void setCurSVFGNode(const SVFGNode *node)
SVFGNodeSet::const_iterator SVFGNodeSetIter
void setFinalCond(const Condition &cond)
Set final condition after all path reachability analysis.
std::string evalFinalCond() const
Evaluate final condition.
NodeID getId() const
Get ID.
bool isAllPathReachable(Condition &condition)
whether condition is satisfiable for all possible boolean guards
NodeBS exactCondElem(const Condition &cond)
Iterator every element of the condition.
const ICFGNode * getCondInst(u32_t id) const
Get/Set instruction based on Z3 expression id.
bool isNegCond(u32_t id) const
VFGEdge::VFGEdgeSetTy::const_iterator const_iterator
const CallICFGNode * getCallSite(CallSiteID id) const
std::ostream & outs()
Overwrite llvm::outs()
llvm::IRBuilder IRBuilder
std::unordered_set< Key, Hash, KeyEqual, Allocator > Set