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

#include <FlowSensitive.h>

Inheritance diagram for SVF::FlowSensitive:
SVF::WPAFSSolver< GraphType > SVF::BVDataPTAImpl SVF::WPASolver< GraphType > SVF::PointerAnalysis SVF::VersionedFlowSensitive

Public Types

typedef BVDataPTAImpl::MutDFPTDataTy MutDFPTDataTy
 
typedef BVDataPTAImpl::MutDFPTDataTy::DFPtsMap DFInOutMap
 
typedef BVDataPTAImpl::MutDFPTDataTy::PtsMap PtsMap
 
- Public Types inherited from SVF::WPASolver< GraphType >
typedef SVF::GenericGraphTraits< GraphTypeGTraits
 Define the GTraits and node iterator for printing.
 
typedef GTraits::NodeRef GNODE
 
typedef GTraits::EdgeType GEDGE
 
typedef GTraits::ChildIteratorType child_iterator
 
typedef SCCDetection< GraphTypeSCC
 
typedef FIFOWorkList< NodeIDWorkList
 
- 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

 FlowSensitive (SVFIR *_pag, PTATY type=PTATY::FSSPARSE_WPA)
 Constructor.
 
 ~FlowSensitive () override=default
 Destructor.
 
virtual bool runOnModule ()
 We start from here.
 
void analyze () override
 Flow sensitive analysis.
 
virtual void solveAndwritePtsToFile (const std::string &filename)
 
virtual void readPtsFromFile (const std::string &filename)
 
virtual void solveConstraints ()
 
void initialize () override
 Initialize analysis.
 
void finalize () override
 Finalize analysis.
 
const std::string PTAName () const override
 Get PTA name.
 
SVFGgetSVFG () const
 Return SVFG.
 
- Public Member Functions inherited from SVF::WPAFSSolver< GraphType >
 WPAFSSolver ()
 Constructor.
 
virtual ~WPAFSSolver ()
 Destructor.
 
virtual NodeID sccRepNode (NodeID id) const
 SCC methods.
 
- 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
 
const NodeSetgetRevPts (NodeID nodeId) 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.
 
AliasResult alias (NodeID node1, NodeID node2) override
 Interface expose to users of our pointer analysis, given PAGNodeID.
 
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.
 
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
 

Static Public Member Functions

static FlowSensitivecreateFSWPA (SVFIR *_pag)
 Create single instance of flow-sensitive pointer analysis.
 
static void releaseFSWPA ()
 Release flow-sensitive pointer analysis.
 
static bool classof (const FlowSensitive *)
 Methods for support type inquiry through isa, cast, and dyn_cast.
 
static bool classof (const PointerAnalysis *pta)
 
- Static Public Member Functions inherited from SVF::BVDataPTAImpl
static bool classof (const PointerAnalysis *pta)
 

Protected Types

typedef SVFG::SVFGEdgeSetTy SVFGEdgeSetTy
 

Protected Member Functions

NodeStackSCCDetect () override
 SCC detection.
 
bool propFromSrcToDst (SVFGEdge *edge) override
 Propagation.
 
virtual bool propAlongDirectEdge (const DirectSVFGEdge *edge)
 Propagate points-to information along a DIRECT SVFG edge.
 
virtual bool propAlongIndirectEdge (const IndirectSVFGEdge *edge)
 Propagate points-to information along an INDIRECT SVFG edge.
 
virtual bool propVarPtsFromSrcToDst (NodeID var, const SVFGNode *src, const SVFGNode *dst)
 Propagate points-to information of a certain variable from src to dst.
 
virtual bool propagateFromAPToFP (const ActualParmSVFGNode *ap, const SVFGNode *dst)
 
virtual bool propagateFromFRToAR (const FormalRetSVFGNode *fr, const SVFGNode *dst)
 
virtual bool weakUpdateOutFromIn (const SVFGNode *node)
 Handle weak updates.
 
virtual bool strongUpdateOutFromIn (const SVFGNode *node, NodeID singleton)
 Handle strong updates.
 
bool propVarPtsAfterCGUpdated (NodeID var, const SVFGNode *src, const SVFGNode *dst)
 
virtual bool propDFOutToIn (const SVFGNode *srcStmt, NodeID srcVar, const SVFGNode *dstStmt, NodeID dstVar)
 
virtual bool propDFInToIn (const SVFGNode *srcStmt, NodeID srcVar, const SVFGNode *dstStmt, NodeID dstVar)
 
bool updateOutFromIn (const SVFGNode *srcStmt, NodeID srcVar, const SVFGNode *dstStmt, NodeID dstVar)
 Update data-flow points-to data.
 
virtual bool updateInFromIn (const SVFGNode *srcStmt, NodeID srcVar, const SVFGNode *dstStmt, NodeID dstVar)
 
virtual bool updateInFromOut (const SVFGNode *srcStmt, NodeID srcVar, const SVFGNode *dstStmt, NodeID dstVar)
 
virtual bool unionPtsFromIn (const SVFGNode *stmt, NodeID srcVar, NodeID dstVar)
 
virtual bool unionPtsFromTop (const SVFGNode *stmt, NodeID srcVar, NodeID dstVar)
 
void clearAllDFOutVarFlag (const SVFGNode *stmt)
 
void processNode (NodeID nodeId) override
 Handle various constraints.
 
bool processSVFGNode (SVFGNode *node)
 
virtual bool processAddr (const AddrSVFGNode *addr)
 
virtual bool processCopy (const CopySVFGNode *copy)
 
virtual bool processPhi (const PHISVFGNode *phi)
 
virtual bool processGep (const GepSVFGNode *edge)
 
virtual bool processLoad (const LoadSVFGNode *load)
 
virtual bool processStore (const StoreSVFGNode *store)
 
bool updateCallGraph (const CallSiteToFunPtrMap &callsites) override
 Update call graph.
 
void connectCallerAndCallee (const CallEdgeMap &newEdges, SVFGEdgeSetTy &edges)
 Connect nodes in SVFG.
 
virtual void updateConnectedNodes (const SVFGEdgeSetTy &edges)
 Update nodes connected during updating call graph.
 
bool isStrongUpdate (const SVFGNode *node, NodeID &singleton)
 Return TRUE if this is a strong update STORE statement.
 
virtual void countAliases (Set< std::pair< NodeID, NodeID > > cmp, unsigned *mayAliases, unsigned *noAliases)
 Fills may/noAliases for the location/pointer pairs in cmp.
 
const PointsTogetDFInPtsSet (const SVFGNode *stmt, const NodeID node)
 Get points-to set for a node from data flow IN/OUT set at a statement.
 
const PointsTogetDFOutPtsSet (const SVFGNode *stmt, const NodeID node)
 
virtual void cluster (void)
 
virtual void plainMap (void) const
 Sets the global best mapping as a plain mapping, i.e. n -> n.
 
void svfgStat ()
 
const DFInOutMapgetDFInputMap () const
 
const DFInOutMapgetDFOutputMap () const
 
- Protected Member Functions inherited from SVF::WPASolver< GraphType >
 WPASolver ()
 Constructor.
 
virtual ~WPASolver ()=default
 Destructor.
 
SCCgetSCCDetector () const
 Get SCC detector.
 
const GraphType graph ()
 Get/Set graph methods.
 
void setGraph (GraphType g)
 
virtual NodeStackSCCDetect (NodeSet &candidates)
 
virtual void initWorklist ()
 
virtual void solveWorklist ()
 
virtual void collapseFields ()
 collapse positive weight cycles of a graph
 
virtual void propagate (GNODE *v)
 
virtual bool propFromSrcToDst (GEDGE *)
 Propagate information from source to destination node, to be implemented in the child class.
 
NodeID popFromWorklist ()
 Worklist operations.
 
virtual void pushIntoWorklist (NodeID id)
 
bool isWorklistEmpty ()
 
bool isInWorklist (NodeID id)
 
GNODENode (NodeID id)
 Get node on the graph.
 
NodeID Node_Index (GNODE node)
 Get node ID.
 
- Protected Member Functions inherited from SVF::BVDataPTAImpl
PTDataTygetPTDataTy () const
 Get points-to data structure.
 
DiffPTDataTygetDiffPTDataTy () const
 
DFPTDataTygetDFPTDataTy () const
 
MutDFPTDataTygetMutDFPTDataTy () const
 
VersionedPTDataTygetVersionedPTDataTy () const
 
virtual void onTheFlyCallGraphSolve (const CallSiteToFunPtrMap &callsites, CallEdgeMap &newEdges)
 On the fly call graph construction.
 
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

SVFGsvfg
 
SVFGBuilder memSSA
 
AndersenWaveDiffander
 
std::vector< std::pair< hclust_fast_methods, std::vector< NodeID > > > candidateMappings
 Save candidate mappings for evaluation's sake.
 
u32_t numOfProcessedAddr
 Statistics.
 
u32_t numOfProcessedCopy
 Number of processed Addr node.
 
u32_t numOfProcessedGep
 Number of processed Copy node.
 
u32_t numOfProcessedPhi
 Number of processed Gep node.
 
u32_t numOfProcessedLoad
 Number of processed Phi node.
 
u32_t numOfProcessedStore
 Number of processed Load node.
 
u32_t numOfProcessedActualParam
 Number of processed Store node.
 
u32_t numOfProcessedFormalRet
 Number of processed actual param node.
 
u32_t numOfProcessedMSSANode
 Number of processed formal ret node.
 
u32_t maxSCCSize
 Number of processed mssa node.
 
u32_t numOfSCC
 
u32_t numOfNodesInSCC
 
double solveTime
 time of solve.
 
double sccTime
 time of SCC detection.
 
double processTime
 time of processNode.
 
double propagationTime
 time of points-to propagation.
 
double directPropaTime
 time of points-to propagation of address-taken objects
 
double indirectPropaTime
 time of points-to propagation of top-level pointers
 
double updateTime
 time of strong/weak updates.
 
double addrTime
 time of handling address edges
 
double copyTime
 time of handling copy edges
 
double gepTime
 time of handling gep edges
 
double loadTime
 time of load edges
 
double storeTime
 time of store edges
 
double phiTime
 time of phi nodes.
 
double updateCallGraphTime
 time of updating call graph
 
NodeBS svfgHasSU
 
- Protected Attributes inherited from SVF::WPAFSSolver< GraphType >
NodeStack nodeStack
 stack used for processing nodes.
 
- Protected Attributes inherited from SVF::WPASolver< GraphType >
bool reanalyze
 Reanalyze if any constraint value changed.
 
u32_t iterationForPrintStat
 print out statistics for i-th iteration
 
GraphType _graph
 Graph.
 
std::unique_ptr< SCCscc
 SCC.
 
WorkList worklist
 Worklist for resolution.
 
- 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

static std::unique_ptr< FlowSensitivefspta
 
- Static Protected Attributes inherited from SVF::PointerAnalysis
static SVFIRpag = nullptr
 SVFIR.
 

Friends

class FlowSensitiveStat
 

Additional Inherited Members

- Public Attributes inherited from SVF::WPASolver< GraphType >
u32_t numOfIteration
 num of iterations during constraint solving
 
- 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_"
 

Detailed Description

Definition at line 48 of file FlowSensitive.h.

Member Typedef Documentation

◆ DFInOutMap

Definition at line 56 of file FlowSensitive.h.

◆ MutDFPTDataTy

Definition at line 55 of file FlowSensitive.h.

◆ PtsMap

Definition at line 57 of file FlowSensitive.h.

◆ SVFGEdgeSetTy

Definition at line 52 of file FlowSensitive.h.

Constructor & Destructor Documentation

◆ FlowSensitive()

SVF::FlowSensitive::FlowSensitive ( SVFIR _pag,
PTATY  type = PTATY::FSSPARSE_WPA 
)
inlineexplicit

Constructor.

Definition at line 60 of file FlowSensitive.h.

61 {
62 svfg = nullptr;
72 }
newitem type
Definition cJSON.cpp:2739
BVDataPTAImpl(SVFIR *pag, PTATY type, bool alias_check=true)
Constructor.
u32_t numOfProcessedLoad
Number of processed Phi node.
u32_t numOfProcessedCopy
Number of processed Addr node.
double gepTime
time of handling gep edges
double indirectPropaTime
time of points-to propagation of top-level pointers
double addrTime
time of handling address edges
double solveTime
time of solve.
u32_t numOfProcessedStore
Number of processed Load node.
double storeTime
time of store edges
double copyTime
time of handling copy edges
u32_t numOfProcessedGep
Number of processed Copy node.
u32_t maxSCCSize
Number of processed mssa node.
double loadTime
time of load edges
u32_t numOfProcessedActualParam
Number of processed Store node.
u32_t numOfProcessedPhi
Number of processed Gep node.
double propagationTime
time of points-to propagation.
u32_t numOfProcessedFormalRet
Number of processed actual param node.
double directPropaTime
time of points-to propagation of address-taken objects
double processTime
time of processNode.
u32_t numOfProcessedAddr
Statistics.
double phiTime
time of phi nodes.
double sccTime
time of SCC detection.
double updateTime
time of strong/weak updates.
u32_t numOfProcessedMSSANode
Number of processed formal ret node.
double updateCallGraphTime
time of updating call graph
u32_t OnTheFlyIterBudgetForStat
Flag for iteration budget for on-the-fly statistics.
u32_t iterationForPrintStat
print out statistics for i-th iteration
Definition WPASolver.h:173
WPAFSSolver< SVFG * > WPASVFGFSSolver

◆ ~FlowSensitive()

SVF::FlowSensitive::~FlowSensitive ( )
overridedefault

Destructor.

Member Function Documentation

◆ analyze()

void FlowSensitive::analyze ( )
overridevirtual

Flow sensitive analysis.

Start analysis

Implements SVF::PointerAnalysis.

Definition at line 127 of file FlowSensitive.cpp.

128{
129 if(!Options::ReadAnder().empty())
130 {
132 }
133 else
134 {
135 if(Options::WriteAnder().empty())
136 {
137 initialize();
139 finalize();
140 }
141 else
142 {
144 }
145 }
146}
virtual void solveConstraints()
virtual void readPtsFromFile(const std::string &filename)
void finalize() override
Finalize analysis.
void initialize() override
Initialize analysis.
virtual void solveAndwritePtsToFile(const std::string &filename)
static const Option< std::string > ReadAnder
Definition Options.h:208
static const Option< std::string > WriteAnder
Definition Options.h:206

◆ classof() [1/2]

static bool SVF::FlowSensitive::classof ( const FlowSensitive )
inlinestatic

Methods for support type inquiry through isa, cast, and dyn_cast.

Definition at line 123 of file FlowSensitive.h.

124 {
125 return true;
126 }

◆ classof() [2/2]

static bool SVF::FlowSensitive::classof ( const PointerAnalysis pta)
inlinestatic

Definition at line 127 of file FlowSensitive.h.

128 {
129 return pta->getAnalysisTy() == PTATY::FSSPARSE_WPA;
130 }
@ FSSPARSE_WPA
Sparse flow sensitive WPA.
Definition PTATY.h:20

◆ clearAllDFOutVarFlag()

void SVF::FlowSensitive::clearAllDFOutVarFlag ( const SVFGNode stmt)
inlineprotected

Definition at line 210 of file FlowSensitive.h.

211 {
212 getDFPTDataTy()->clearAllDFOutUpdatedVar(stmt->getId());
213 }
DFPTDataTy * getDFPTDataTy() const
llvm::IRBuilder IRBuilder
Definition BasicTypes.h:76

◆ cluster()

void FlowSensitive::cluster ( void  )
protectedvirtual

Performs clustering based on ander, setting the global best mapping accordingly.

Reimplemented in SVF::VersionedFlowSensitive.

Definition at line 822 of file FlowSensitive.cpp.

823{
824 std::vector<std::pair<unsigned, unsigned>> keys;
825 for (const auto& pair : *pag)
827
828 PointsTo::MappingPtr nodeMapping =
829 std::make_shared<std::vector<NodeID>>(
831 );
832 PointsTo::MappingPtr reverseNodeMapping =
833 std::make_shared<std::vector<NodeID>>(NodeIDAllocator::Clusterer::getReverseNodeMapping(*nodeMapping));
834
835 PointsTo::setCurrentBestNodeMapping(nodeMapping, reverseNodeMapping);
836}
AndersenWaveDiff * ander
std::vector< std::pair< hclust_fast_methods, std::vector< NodeID > > > candidateMappings
Save candidate mappings for evaluation's sake.
static std::vector< NodeID > getReverseNodeMapping(const std::vector< NodeID > &nodeMapping)
static std::vector< NodeID > cluster(BVDataPTAImpl *pta, const std::vector< std::pair< NodeID, unsigned > > keys, std::vector< std::pair< hclust_fast_methods, std::vector< NodeID > > > &candidates, std::string evalSubtitle="", bool printStat=true)
bool print_stat
User input flags.
static SVFIR * pag
SVFIR.
std::shared_ptr< std::vector< NodeID > > MappingPtr
Definition PointsTo.h:42
static void setCurrentBestNodeMapping(MappingPtr newCurrentBestNodeMapping, MappingPtr newCurrentBestReverseNodeMapping)
Definition PointsTo.cpp:371

◆ connectCallerAndCallee()

void FlowSensitive::connectCallerAndCallee ( const CallEdgeMap newEdges,
SVFGEdgeSetTy edges 
)
protected

Connect nodes in SVFG.

Handle parameter passing in SVFG

Definition at line 737 of file FlowSensitive.cpp.

738{
739 CallEdgeMap::const_iterator iter = newEdges.begin();
740 CallEdgeMap::const_iterator eiter = newEdges.end();
741 for (; iter != eiter; iter++)
742 {
743 const CallICFGNode* cs = iter->first;
744 const FunctionSet & functions = iter->second;
745 for (FunctionSet::const_iterator func_iter = functions.begin(); func_iter != functions.end(); func_iter++)
746 {
747 const FunObjVar* func = *func_iter;
749 }
750 }
751}
Set< const FunObjVar * > FunctionSet
virtual void connectCallerAndCallee(const CallICFGNode *cs, const FunObjVar *callee, SVFGEdgeSetTy &edges)
Connect SVFG nodes between caller and callee for indirect call site.
Definition SVFG.cpp:658

◆ countAliases()

void FlowSensitive::countAliases ( Set< std::pair< NodeID, NodeID > >  cmp,
unsigned mayAliases,
unsigned noAliases 
)
protectedvirtual

Fills may/noAliases for the location/pointer pairs in cmp.

Definition at line 855 of file FlowSensitive.cpp.

856{
857 for (std::pair<NodeID, NodeID> locPA : cmp)
858 {
859 // loc doesn't make a difference for FSPTA.
860 NodeID p = locPA.second;
861 for (std::pair<NodeID, NodeID> locPB : cmp)
862 {
863 if (locPB == locPA) continue;
864
865 NodeID q = locPB.second;
866
867 switch (alias(p, q))
868 {
870 ++(*noAliases);
871 break;
873 ++(*mayAliases);
874 break;
875 default:
876 assert("Not May/NoAlias?");
877 }
878 }
879 }
880
881}
cJSON * p
Definition cJSON.cpp:2559
AliasResult alias(const SVFVar *V1, const SVFVar *V2) override
Interface expose to users of our pointer analysis, given Value infos.
u32_t NodeID
Definition GeneralType.h:56
@ MayAlias
Definition SVFType.h:638
@ NoAlias
Definition SVFType.h:637

◆ createFSWPA()

static FlowSensitive * SVF::FlowSensitive::createFSWPA ( SVFIR _pag)
inlinestatic

Create single instance of flow-sensitive pointer analysis.

Definition at line 78 of file FlowSensitive.h.

79 {
80 if (fspta == nullptr)
81 {
82 fspta = std::unique_ptr<FlowSensitive>(new FlowSensitive(_pag));
83 fspta->analyze();
84 }
85 return fspta.get();
86 }
static std::unique_ptr< FlowSensitive > fspta
FlowSensitive(SVFIR *_pag, PTATY type=PTATY::FSSPARSE_WPA)
Constructor.

◆ finalize()

void FlowSensitive::finalize ( )
overridevirtual

Finalize analysis.

Finalize analysis

Reimplemented from SVF::BVDataPTAImpl.

Reimplemented in SVF::VersionedFlowSensitive.

Definition at line 162 of file FlowSensitive.cpp.

163{
164 if(Options::DumpVFG())
165 svfg->dump("fs_solved", true);
166
168 while (nodeStack.empty() == false)
169 {
170 NodeID rep = nodeStack.top();
171 nodeStack.pop();
172 const NodeBS& subNodes = getSCCDetector()->subNodes(rep);
173 if (subNodes.count() > maxSCCSize)
174 maxSCCSize = subNodes.count();
175 if (subNodes.count() > 1)
176 {
177 numOfNodesInSCC += subNodes.count();
178 numOfSCC++;
179 }
180 }
181
182 // TODO: check -stat too.
183 if (Options::ClusterFs())
184 {
186 const PTDataTy *ptd = getPTDataTy();
187 // TODO: should we use liveOnly?
188 Map<PointsTo, unsigned> allPts = ptd->getAllPts(true);
189 // TODO: parameterise final arg.
191 if (print_stat)
192 {
194 }
195 }
196
198}
void finalize() override
Finalization of pointer analysis, and normalize points-to information to Bit Vector representation.
PTData< NodeID, NodeSet, NodeID, PointsTo > PTDataTy
PTDataTy * getPTDataTy() const
Get points-to data structure.
static void printStats(std::string title, Map< std::string, std::string > &stats)
static void evaluate(const std::vector< NodeID > &nodeMap, const Map< PointsTo, unsigned > pointsToSets, Map< std::string, std::string > &stats, bool accountForOcc)
Fills in *NumWords statistics in stats..
static const Option< bool > ClusterFs
Whether to cluster FS or VFS with the auxiliary Andersen's.
Definition Options.h:41
static const Option< bool > DumpVFG
Definition Options.h:108
static MappingPtr getCurrentBestNodeMapping()
Definition PointsTo.cpp:361
void dump(const std::string &file, bool simple=false)
Dump graph into dot file.
Definition SVFG.cpp:576
unsigned count() const
NodeStack nodeStack
stack used for processing nodes.
Definition WPAFSSolver.h:64
SCC * getSCCDetector() const
Get SCC detector.
Definition WPASolver.h:67
virtual NodeStack & SCCDetect()
SCC detection.
Definition WPASolver.h:86
std::stack< NodeID > NodeStack

◆ getDFInPtsSet()

const PointsTo & SVF::FlowSensitive::getDFInPtsSet ( const SVFGNode stmt,
const NodeID  node 
)
inlineprotected

Get points-to set for a node from data flow IN/OUT set at a statement.

Definition at line 247 of file FlowSensitive.h.

248 {
249 return getDFPTDataTy()->getDFInPtsSet(stmt->getId(),node);
250 }

◆ getDFInputMap()

const DFInOutMap & SVF::FlowSensitive::getDFInputMap ( ) const
inlineprotected

Get IN/OUT data flow map. May only be called when the backing is MUTABLE.

Definition at line 260 of file FlowSensitive.h.

261 {
262 return getMutDFPTDataTy()->getDFIn();
263 }
MutDFPTDataTy * getMutDFPTDataTy() const
const DFPtsMap & getDFIn()

◆ getDFOutPtsSet()

const PointsTo & SVF::FlowSensitive::getDFOutPtsSet ( const SVFGNode stmt,
const NodeID  node 
)
inlineprotected

Definition at line 251 of file FlowSensitive.h.

252 {
253 return getDFPTDataTy()->getDFOutPtsSet(stmt->getId(),node);
254 }

◆ getDFOutputMap()

const DFInOutMap & SVF::FlowSensitive::getDFOutputMap ( ) const
inlineprotected

Definition at line 264 of file FlowSensitive.h.

265 {
266 return getMutDFPTDataTy()->getDFOut();
267 }
const DFPtsMap & getDFOut()

◆ getSVFG()

SVFG * SVF::FlowSensitive::getSVFG ( ) const
inline

Return SVFG.

Definition at line 134 of file FlowSensitive.h.

135 {
136 return svfg;
137 }

◆ initialize()

void FlowSensitive::initialize ( )
overridevirtual

Initialize analysis.

Initialize analysis

Reimplemented from SVF::PointerAnalysis.

Reimplemented in SVF::VersionedFlowSensitive.

Definition at line 44 of file FlowSensitive.cpp.

45{
47
48 stat = new FlowSensitiveStat(this);
49
50 // TODO: support clustered aux. Andersen's.
51 assert(!Options::ClusterAnder() && "FlowSensitive::initialize: clustering auxiliary Andersen's unsupported.");
53
54 // If cluster option is not set, it will give us a no-mapping points-to set.
56 && "FS::init: plain-mapping and cluster-fs are mutually exclusive.");
58 {
59 cluster();
60 // Reset the points-to cache although empty so the new mapping could
61 // be applied to the inserted empty set.
62 getPtCache().reset();
63 }
64 else if (Options::PlainMappingFs())
65 {
66 plainMap();
67 // As above.
68 getPtCache().reset();
69 }
70
72
74 //AndersenWaveDiff::releaseAndersenWaveDiff();
75}
static AndersenWaveDiff * createAndersenWaveDiff(SVFIR *_pag)
Create an singleton instance directly instead of invoking llvm pass manager.
Definition Andersen.h:408
PersistentPointsToCache< PointsTo > & getPtCache()
virtual void plainMap(void) const
Sets the global best mapping as a plain mapping, i.e. n -> n.
friend class FlowSensitiveStat
virtual void cluster(void)
static const Option< bool > PlainMappingFs
Use an explicitly plain mapping with flow-sensitive (not null).
Definition Options.h:44
static const Option< bool > ClusterAnder
Whether to stage Andersen's with Steensgaard and cluster based on that data.
Definition Options.h:38
virtual void initialize()
Initialization of a pointer analysis, including building symbol table and SVFIR etc.
PTAStat * stat
Statistics.
SVFIR * getPAG() const
SVFG * buildPTROnlySVFG(BVDataPTAImpl *pta)
void setGraph(GraphType g)
Definition WPASolver.h:78

◆ isStrongUpdate()

bool FlowSensitive::isStrongUpdate ( const SVFGNode node,
NodeID singleton 
)
protected

Return TRUE if this is a strong update STORE statement.

Return TRUE if this is a strong update STORE statement.

Find the unique element in cpts

Definition at line 654 of file FlowSensitive.cpp.

655{
656 bool isSU = false;
657 if (const StoreSVFGNode* store = SVFUtil::dyn_cast<StoreSVFGNode>(node))
658 {
659 const PointsTo& dstCPSet = getPts(store->getDstNodeID());
660 if (dstCPSet.count() == 1)
661 {
664 singleton = *it;
665
666 // Strong update can be made if this points-to target is not heap, array or field-insensitive.
668 {
672 {
673 isSU = true;
674 }
675 }
676 }
677 }
678 return isSU;
679}
const PointsTo & getPts(NodeID id) override
bool isFieldInsensitive() const
Return true if its field limit is 0.
bool isLocalVarInRecursiveFun(NodeID id) const
Whether a local variable is in function recursions.
bool isArrayMemObj(NodeID id) const
bool isHeapMemObj(NodeID id) const
Whether this object is heap or array.
const BaseObjVar * getBaseObject(NodeID id) const
Definition SVFIR.h:496

◆ plainMap()

void FlowSensitive::plainMap ( void  ) const
protectedvirtual

Sets the global best mapping as a plain mapping, i.e. n -> n.

Definition at line 838 of file FlowSensitive.cpp.

839{
841 && "FS::cluster: plain mapping requires dense allocation strategy.");
842
843 const size_t numObjects = NodeIDAllocator::get()->getNumObjects();
844 PointsTo::MappingPtr plainMapping = std::make_shared<std::vector<NodeID>>(numObjects);
845 PointsTo::MappingPtr reversePlainMapping = std::make_shared<std::vector<NodeID>>(numObjects);
846 for (NodeID i = 0; i < plainMapping->size(); ++i)
847 {
848 plainMapping->at(i) = i;
849 reversePlainMapping->at(i) = i;
850 }
851
853}
static NodeIDAllocator * get(void)
Return (singleton) allocator.
NodeID getNumObjects(void) const
Returns the total number of memory objects.
static const OptionMap< SVF::NodeIDAllocator::Strategy > NodeAllocStrat
Definition Options.h:32

◆ processAddr()

bool FlowSensitive::processAddr ( const AddrSVFGNode addr)
protectedvirtual

Process address node

TODO: If this object has been set as field-insensitive, just add the insensitive object node into dst pointer's pts.

Definition at line 444 of file FlowSensitive.cpp.

445{
446 double start = stat->getClk();
447 NodeID srcID = addr->getSrcNodeID();
452 bool changed = addPts(addr->getDstNodeID(), srcID);
453 double end = stat->getClk();
454 addrTime += (end - start) / TIMEINTERVAL;
455 return changed;
456}
#define TIMEINTERVAL
Definition SVFType.h:621
virtual bool addPts(NodeID id, NodeID ptd)
bool isFieldInsensitive(NodeID id) const
NodeID getFIObjVar(NodeID id)
static double getClk(bool mark=false)
Definition SVFStat.cpp:51

◆ processCopy()

bool FlowSensitive::processCopy ( const CopySVFGNode copy)
protectedvirtual

Process copy node

Definition at line 461 of file FlowSensitive.cpp.

462{
463 double start = stat->getClk();
464 bool changed = unionPts(copy->getDstNodeID(), copy->getSrcNodeID());
465 double end = stat->getClk();
466 copyTime += (end - start) / TIMEINTERVAL;
467 return changed;
468}
copy
Definition cJSON.cpp:414
virtual bool unionPts(NodeID id, const PointsTo &target)

◆ processGep()

bool FlowSensitive::processGep ( const GepSVFGNode edge)
protectedvirtual

Process gep node

Definition at line 494 of file FlowSensitive.cpp.

495{
496 double start = stat->getClk();
497 bool changed = false;
498 const PointsTo& srcPts = getPts(edge->getSrcNodeID());
499
501 const GepStmt* gepStmt = SVFUtil::cast<GepStmt>(edge->getSVFStmt());
502 if (gepStmt->isVariantFieldGep())
503 {
504 for (NodeID o : srcPts)
505 {
507 {
508 tmpDstPts.set(o);
509 continue;
510 }
511
513 tmpDstPts.set(getFIObjVar(o));
514 }
515 }
516 else
517 {
518 for (NodeID o : srcPts)
519 {
521 {
522 tmpDstPts.set(o);
523 continue;
524 }
525
526 NodeID fieldSrcPtdNode = getGepObjVar(o, gepStmt->getAccessPath().getConstantStructFldIdx());
528 }
529 }
530
531 if (unionPts(edge->getDstNodeID(), tmpDstPts))
532 changed = true;
533
534 double end = stat->getClk();
535 gepTime += (end - start) / TIMEINTERVAL;
536 return changed;
537}
virtual bool isBlkObjOrConstantObj(NodeID ptd) const
NodeID getGepObjVar(NodeID id, const APOffset &ap)
void setObjFieldInsensitive(NodeID id)

◆ processLoad()

bool FlowSensitive::processLoad ( const LoadSVFGNode load)
protectedvirtual

Process load node

Foreach node \in src pts(dst) = union pts(node)

If the ptd is a field-insensitive node, we should also get all field nodes' points-to sets and pass them to pagDst.

Reimplemented in SVF::VersionedFlowSensitive.

Definition at line 546 of file FlowSensitive.cpp.

547{
548 double start = stat->getClk();
549 bool changed = false;
550
551 NodeID dstVar = load->getDstNodeID();
552
553 const PointsTo& srcPts = getPts(load->getSrcNodeID());
554
555 // p = *q, the type of p must be a pointer
556 if(load->getDstNode()->isPointer())
557 {
558 for (PointsTo::iterator ptdIt = srcPts.begin(); ptdIt != srcPts.end(); ++ptdIt)
559 {
560 NodeID ptd = *ptdIt;
561
562 if (pag->isConstantObj(ptd))
563 continue;
564
565 if (unionPtsFromIn(load, ptd, dstVar))
566 changed = true;
567
569 {
573 for (NodeBS::iterator fieldIt = allFields.begin(), fieldEit = allFields.end();
575 {
576 if (unionPtsFromIn(load, *fieldIt, dstVar))
577 changed = true;
578 }
579 }
580 }
581 }
582 double end = stat->getClk();
583 loadTime += (end - start) / TIMEINTERVAL;
584 return changed;
585}
virtual bool unionPtsFromIn(const SVFGNode *stmt, NodeID srcVar, NodeID dstVar)
const ValVar * getDstNode() const
Definition VFGNode.h:217
virtual const NodeBS & getAllFieldsObjVars(NodeID id)
bool isConstantObj(NodeID id) const
Definition SVFIR.h:540
virtual bool isPointer() const
Check if this variable represents a pointer.
NodeID getSrcNodeID() const
Definition VFGNode.h:152
NodeID getDstNodeID() const
Definition VFGNode.h:157

◆ processNode()

void FlowSensitive::processNode ( NodeID  nodeId)
overrideprotectedvirtual

Handle various constraints.

Process each SVFG node

Reimplemented from SVF::WPASolver< GraphType >.

Reimplemented in SVF::VersionedFlowSensitive.

Definition at line 215 of file FlowSensitive.cpp.

216{
218 if (processSVFGNode(node))
219 propagate(&node);
220
222}
void clearAllDFOutVarFlag(const SVFGNode *stmt)
bool processSVFGNode(SVFGNode *node)
SVFGNode * getSVFGNode(NodeID id) const
Get a SVFG node.
Definition SVFG.h:150
virtual void propagate(GNODE *v)
Definition WPASolver.h:127

◆ processPhi()

bool FlowSensitive::processPhi ( const PHISVFGNode phi)
protectedvirtual

Process mssa phi node

Definition at line 473 of file FlowSensitive.cpp.

474{
475 double start = stat->getClk();
476 bool changed = false;
477 NodeID pagDst = phi->getRes()->getId();
478 for (PHISVFGNode::OPVers::const_iterator it = phi->opVerBegin(), eit = phi->opVerEnd(); it != eit; ++it)
479 {
480 NodeID src = it->second->getId();
481 const PointsTo& srcPts = getPts(src);
482 if (unionPts(pagDst, srcPts))
483 changed = true;
484 }
485
486 double end = stat->getClk();
487 phiTime += (end - start) / TIMEINTERVAL;
488 return changed;
489}
GEdgeSetTy::const_iterator const_iterator

◆ processStore()

bool FlowSensitive::processStore ( const StoreSVFGNode store)
protectedvirtual

Process store node

foreach node \in dst pts(node) = union pts(src)

STORE statement can only be processed if the pointer on the LHS points to something. If we handle STORE with an empty points-to set, the OUT set will be updated from IN set. Then if LHS pointer points-to one target and it has been identified as a strong update, we can't remove those points-to information computed before this strong update from the OUT set.

check if this is a strong updates store

Reimplemented in SVF::VersionedFlowSensitive.

Definition at line 593 of file FlowSensitive.cpp.

594{
595
596 const PointsTo & dstPts = getPts(store->getDstNodeID());
597
604 if (dstPts.empty())
605 return false;
606
607 double start = stat->getClk();
608 bool changed = false;
609
610 // *p = q, the type of q must be a pointer
611 if(getPts(store->getSrcNodeID()).empty() == false && store->getSrcNode()->isPointer())
612 {
613 for (PointsTo::iterator it = dstPts.begin(), eit = dstPts.end(); it != eit; ++it)
614 {
615 NodeID ptd = *it;
616
617 if (pag->isConstantObj(ptd))
618 continue;
619
620 if (unionPtsFromTop(store, store->getSrcNodeID(), ptd))
621 changed = true;
622 }
623 }
624
625 double end = stat->getClk();
626 storeTime += (end - start) / TIMEINTERVAL;
627
628 double updateStart = stat->getClk();
629 // also merge the DFInSet to DFOutSet.
632 bool isSU = isStrongUpdate(store, singleton);
633 if (isSU)
634 {
635 svfgHasSU.set(store->getId());
637 changed = true;
638 }
639 else
640 {
641 svfgHasSU.reset(store->getId());
642 if (weakUpdateOutFromIn(store))
643 changed = true;
644 }
645 double updateEnd = stat->getClk();
647
648 return changed;
649}
bool isStrongUpdate(const SVFGNode *node, NodeID &singleton)
Return TRUE if this is a strong update STORE statement.
virtual bool unionPtsFromTop(const SVFGNode *stmt, NodeID srcVar, NodeID dstVar)
virtual bool strongUpdateOutFromIn(const SVFGNode *node, NodeID singleton)
Handle strong updates.
virtual bool weakUpdateOutFromIn(const SVFGNode *node)
Handle weak updates.
bool empty() const
Returns true if set is empty.
Definition PointsTo.cpp:98
NodeID getId() const
Get ID.
Definition SVFValue.h:161
void set(unsigned Idx)
void reset(unsigned Idx)
const ValVar * getSrcNode() const
Definition VFGNode.h:274

◆ processSVFGNode()

bool FlowSensitive::processSVFGNode ( SVFGNode node)
protected

Process each SVFG node

Definition at line 227 of file FlowSensitive.cpp.

228{
229 double start = stat->getClk();
230 bool changed = false;
231 if (AddrSVFGNode* addr = SVFUtil::dyn_cast<AddrSVFGNode>(node))
232 {
234 if (processAddr(addr))
235 changed = true;
236 }
237 else if (CopySVFGNode* copy = SVFUtil::dyn_cast<CopySVFGNode>(node))
238 {
240 if (processCopy(copy))
241 changed = true;
242 }
243 else if (GepSVFGNode* gep = SVFUtil::dyn_cast<GepSVFGNode>(node))
244 {
246 if(processGep(gep))
247 changed = true;
248 }
249 else if (LoadSVFGNode* load = SVFUtil::dyn_cast<LoadSVFGNode>(node))
250 {
252 if(processLoad(load))
253 changed = true;
254 }
255 else if (StoreSVFGNode* store = SVFUtil::dyn_cast<StoreSVFGNode>(node))
256 {
258 if (processStore(store))
259 changed = true;
260 }
261 else if (PHISVFGNode* phi = SVFUtil::dyn_cast<PHISVFGNode>(node))
262 {
264 if (processPhi(phi))
265 changed = true;
266 }
269 ActualOUTSVFGNode>(node))
270 {
272 changed = true;
273 }
276 NullPtrSVFGNode>(node))
277 {
278 changed = true;
279 }
280 else if (SVFUtil::isa<CmpVFGNode, BinaryOPVFGNode>(node) ||
281 SVFUtil::dyn_cast<UnaryOPVFGNode>(node))
282 {
283 }
284 else
285 {
286 assert(false && "unexpected kind of SVFG nodes");
287 }
288
289 double end = stat->getClk();
290 processTime += (end - start) / TIMEINTERVAL;
291
292 return changed;
293}
virtual bool processLoad(const LoadSVFGNode *load)
virtual bool processPhi(const PHISVFGNode *phi)
virtual bool processStore(const StoreSVFGNode *store)
virtual bool processCopy(const CopySVFGNode *copy)
virtual bool processAddr(const AddrSVFGNode *addr)
virtual bool processGep(const GepSVFGNode *edge)
LLVM_NODISCARD bool isa(const Y &Val)
Definition Casting.h:241

◆ propagateFromAPToFP()

bool FlowSensitive::propagateFromAPToFP ( const ActualParmSVFGNode ap,
const SVFGNode dst 
)
protectedvirtual

Propagate points-to information from an actual-param to a formal-param. Not necessary if SVFGOPT is used instead of original SVFG.

Propagate points-to information from actual-param to formal-param. Not necessary if SVFGOPT is used instead of original SVFG.

Definition at line 354 of file FlowSensitive.cpp.

355{
356 const FormalParmSVFGNode* fp = SVFUtil::dyn_cast<FormalParmSVFGNode>(dst);
357 assert(fp && "expecting a formal param node");
358
359 NodeID pagDst = fp->getParam()->getId();
360 const PointsTo &srcCPts = getPts(ap->getParam()->getId());
362
363 return changed;
364}
const ValVar * getParam() const
Return parameter.
Definition VFGNode.h:989

◆ propagateFromFRToAR()

bool FlowSensitive::propagateFromFRToAR ( const FormalRetSVFGNode fr,
const SVFGNode dst 
)
protectedvirtual

Propagate points-to information from a formal-ret to an actual-ret. Not necessary if SVFGOPT is used instead of original SVFG.

Propagate points-to information from formal-ret to actual-ret. Not necessary if SVFGOPT is used instead of original SVFG.

Definition at line 370 of file FlowSensitive.cpp.

371{
372 const ActualRetSVFGNode* ar = SVFUtil::dyn_cast<ActualRetSVFGNode>(dst);
373 assert(ar && "expecting an actual return node");
374
375 NodeID pagDst = ar->getRev()->getId();
376 const PointsTo & srcCPts = getPts(fr->getRet()->getId());
378
379 return changed;
380}

◆ propAlongDirectEdge()

bool FlowSensitive::propAlongDirectEdge ( const DirectSVFGEdge edge)
protectedvirtual

Propagate points-to information along a DIRECT SVFG edge.

Propagate points-to information along DIRECT SVFG edge.

Definition at line 323 of file FlowSensitive.cpp.

324{
325 double start = stat->getClk();
326 bool changed = false;
327
328 SVFGNode* src = edge->getSrcNode();
329 SVFGNode* dst = edge->getDstNode();
330 // If this is an actual-param or formal-ret, top-level pointer's pts must be
331 // propagated from src to dst.
332 if (ActualParmSVFGNode* ap = SVFUtil::dyn_cast<ActualParmSVFGNode>(src))
333 changed = propagateFromAPToFP(ap, dst);
334 else if (FormalRetSVFGNode* fp = SVFUtil::dyn_cast<FormalRetSVFGNode>(src))
336 else
337 {
338 // Direct SVFG edge links between def and use of a top-level pointer.
339 // There's no points-to information propagated along direct edge.
340 // Since the top-level pointer's value has been changed at src node,
341 // return TRUE to put dst node into the work list.
342 changed = true;
343 }
344
345 double end = stat->getClk();
347 return changed;
348}
virtual bool propagateFromAPToFP(const ActualParmSVFGNode *ap, const SVFGNode *dst)
virtual bool propagateFromFRToAR(const FormalRetSVFGNode *fr, const SVFGNode *dst)

◆ propAlongIndirectEdge()

bool FlowSensitive::propAlongIndirectEdge ( const IndirectSVFGEdge edge)
protectedvirtual

Propagate points-to information along an INDIRECT SVFG edge.

Propagate points-to information along INDIRECT SVFG edge.

If this is a field-insensitive obj, propagate all field node's pts

Reimplemented in SVF::VersionedFlowSensitive.

Definition at line 385 of file FlowSensitive.cpp.

386{
387 double start = stat->getClk();
388
389 SVFGNode* src = edge->getSrcNode();
390 SVFGNode* dst = edge->getDstNode();
391
392 bool changed = false;
393
394 // Get points-to targets may be used by next SVFG node.
395 // Propagate points-to set for node used in dst.
396 const NodeBS& pts = edge->getPointsTo();
397 for (NodeBS::iterator ptdIt = pts.begin(), ptdEit = pts.end(); ptdIt != ptdEit; ++ptdIt)
398 {
399 NodeID ptd = *ptdIt;
400
401 if (propVarPtsFromSrcToDst(ptd, src, dst))
402 changed = true;
403
405 {
408 for (NodeBS::iterator fieldIt = allFields.begin(), fieldEit = allFields.end();
410 {
411 if (propVarPtsFromSrcToDst(*fieldIt, src, dst))
412 changed = true;
413 }
414 }
415 }
416
417 double end = stat->getClk();
419 return changed;
420}
virtual bool propVarPtsFromSrcToDst(NodeID var, const SVFGNode *src, const SVFGNode *dst)
Propagate points-to information of a certain variable from src to dst.

◆ propDFInToIn()

virtual bool SVF::FlowSensitive::propDFInToIn ( const SVFGNode srcStmt,
NodeID  srcVar,
const SVFGNode dstStmt,
NodeID  dstVar 
)
inlineprotectedvirtual

Definition at line 180 of file FlowSensitive.h.

181 {
182 return getDFPTDataTy()->updateAllDFInFromIn(srcStmt->getId(), srcVar, dstStmt->getId(),dstVar);
183 }

◆ propDFOutToIn()

virtual bool SVF::FlowSensitive::propDFOutToIn ( const SVFGNode srcStmt,
NodeID  srcVar,
const SVFGNode dstStmt,
NodeID  dstVar 
)
inlineprotectedvirtual

Definition at line 176 of file FlowSensitive.h.

177 {
178 return getDFPTDataTy()->updateAllDFInFromOut(srcStmt->getId(), srcVar, dstStmt->getId(),dstVar);
179 }

◆ propFromSrcToDst()

bool FlowSensitive::propFromSrcToDst ( SVFGEdge edge)
overrideprotected

Propagation.

Propagate points-to information from an edge's src node to its dst node.

Propagate points-to information from source to destination node Union dfOutput of src to dfInput of dst. Only propagate points-to set of node which exists on the SVFG edge.

  1. propagation along direct edge will always return TRUE.
  2. propagation along indirect edge will return TRUE if destination node's IN set has been updated.

Definition at line 303 of file FlowSensitive.cpp.

304{
305 double start = stat->getClk();
306 bool changed = false;
307
308 if (DirectSVFGEdge* dirEdge = SVFUtil::dyn_cast<DirectSVFGEdge>(edge))
310 else if (IndirectSVFGEdge* indEdge = SVFUtil::dyn_cast<IndirectSVFGEdge>(edge))
312 else
313 assert(false && "new kind of svfg edge?");
314
315 double end = stat->getClk();
317 return changed;
318}
virtual bool propAlongDirectEdge(const DirectSVFGEdge *edge)
Propagate points-to information along a DIRECT SVFG edge.
virtual bool propAlongIndirectEdge(const IndirectSVFGEdge *edge)
Propagate points-to information along an INDIRECT SVFG edge.

◆ propVarPtsAfterCGUpdated()

bool FlowSensitive::propVarPtsAfterCGUpdated ( NodeID  var,
const SVFGNode src,
const SVFGNode dst 
)
protected

Propagation between newly connected SVFG nodes during updateCallGraph. Can only be used during updateCallGraph.

Propagate points-to information of a certain variable from src to dst.

Definition at line 807 of file FlowSensitive.cpp.

808{
809 if (SVFUtil::isa<StoreSVFGNode>(src))
810 {
811 if (propDFOutToIn(src, var, dst, var))
812 return true;
813 }
814 else
815 {
816 if (propDFInToIn(src, var, dst, var))
817 return true;
818 }
819 return false;
820}
virtual bool propDFInToIn(const SVFGNode *srcStmt, NodeID srcVar, const SVFGNode *dstStmt, NodeID dstVar)
virtual bool propDFOutToIn(const SVFGNode *srcStmt, NodeID srcVar, const SVFGNode *dstStmt, NodeID dstVar)

◆ propVarPtsFromSrcToDst()

bool FlowSensitive::propVarPtsFromSrcToDst ( NodeID  var,
const SVFGNode src,
const SVFGNode dst 
)
protectedvirtual

Propagate points-to information of a certain variable from src to dst.

Propagate points-to information of a certain variable from src to dst.

Definition at line 425 of file FlowSensitive.cpp.

426{
427 bool changed = false;
428 if (SVFUtil::isa<StoreSVFGNode>(src))
429 {
430 if (updateInFromOut(src, var, dst, var))
431 changed = true;
432 }
433 else
434 {
435 if (updateInFromIn(src, var, dst, var))
436 changed = true;
437 }
438 return changed;
439}
virtual bool updateInFromIn(const SVFGNode *srcStmt, NodeID srcVar, const SVFGNode *dstStmt, NodeID dstVar)
virtual bool updateInFromOut(const SVFGNode *srcStmt, NodeID srcVar, const SVFGNode *dstStmt, NodeID dstVar)

◆ PTAName()

const std::string SVF::FlowSensitive::PTAName ( ) const
inlineoverridevirtual

Get PTA name.

Reimplemented from SVF::PointerAnalysis.

Reimplemented in SVF::VersionedFlowSensitive.

Definition at line 116 of file FlowSensitive.h.

117 {
118 return "FlowSensitive";
119 }

◆ readPtsFromFile()

void FlowSensitive::readPtsFromFile ( const std::string &  filename)
virtual

Initialization for the Solver

Load the pts from file

finalize the analysis

Reimplemented in SVF::VersionedFlowSensitive.

Definition at line 148 of file FlowSensitive.cpp.

149{
151 initialize();
153 if(!filename.empty())
154 this->readFromFile(filename);
156 finalize();
157}
virtual bool readFromFile(const std::string &filename)

◆ releaseFSWPA()

static void SVF::FlowSensitive::releaseFSWPA ( )
inlinestatic

Release flow-sensitive pointer analysis.

Definition at line 89 of file FlowSensitive.h.

90 {
91 fspta = nullptr;
92 }

◆ runOnModule()

virtual bool SVF::FlowSensitive::runOnModule ( )
inlinevirtual

We start from here.

Definition at line 95 of file FlowSensitive.h.

96 {
97 return false;
98 }

◆ SCCDetect()

NodeStack & FlowSensitive::SCCDetect ( )
overrideprotectedvirtual

SCC detection.

SCC detection

Reimplemented from SVF::WPAFSSolver< GraphType >.

Definition at line 203 of file FlowSensitive.cpp.

204{
205 double start = stat->getClk();
207 double end = stat->getClk();
208 sccTime += (end - start) / TIMEINTERVAL;
209 return nodeStack;
210}
virtual NodeStack & SCCDetect()
SCC detection.
Definition WPAFSSolver.h:67

◆ solveAndwritePtsToFile()

void FlowSensitive::solveAndwritePtsToFile ( const std::string &  filename)
virtual

Start analysis

Initialization for the Solver

finalize the analysis

Reimplemented in SVF::VersionedFlowSensitive.

Definition at line 111 of file FlowSensitive.cpp.

112{
114 initialize();
115 if(!filename.empty())
118 if(!filename.empty())
121 finalize();
122}
virtual void writeToFile(const std::string &filename)
Interface for analysis result storage on filesystem.
virtual void writeObjVarToFile(const std::string &filename)

◆ solveConstraints()

void FlowSensitive::solveConstraints ( )
virtual

Start solving constraints

Definition at line 76 of file FlowSensitive.cpp.

77{
79
80 double start = stat->getClk(true);
82 DBOUT(DGENERAL, outs() << SVFUtil::pasMsg("Start Solving Constraints\n"));
83
84 do
85 {
87
89 dumpStat();
90
91 callGraphSCC->find();
92
95 }
97
98 DBOUT(DGENERAL, outs() << SVFUtil::pasMsg("Finish Solving Constraints\n"));
99
100 // Reset the time-up alarm; analysis is done.
102
103 double end = stat->getClk(true);
104 solveTime += (end - start) / TIMEINTERVAL;
105
106}
#define DBOUT(TYPE, X)
LLVM debug macros, define type of your DBUG model of each pass.
Definition SVFType.h:593
#define DGENERAL
Definition SVFType.h:599
bool updateCallGraph(const CallSiteToFunPtrMap &callsites) override
Update call graph.
static const Option< u32_t > FsTimeLimit
Time limit for the main phase (i.e., the actual solving) of FS analyses.
Definition Options.h:69
const CallSiteToFunPtrMap & getIndirectCallsites() const
Return all indirect callsites.
void dumpStat()
Dump the statistics.
CallGraphSCC * callGraphSCC
SCC for PTACallGraph.
virtual void initWorklist()
Definition WPASolver.h:97
u32_t numOfIteration
num of iterations during constraint solving
Definition WPASolver.h:200
virtual void solveWorklist()
Definition WPASolver.h:108
void stopAnalysisLimitTimer(bool limitTimerSet)
Definition SVFUtil.cpp:302
std::string pasMsg(const std::string &msg)
Print each pass/phase message by converting a string into blue string output.
Definition SVFUtil.cpp:105
bool startAnalysisLimitTimer(unsigned timeLimit)
Definition SVFUtil.cpp:281
std::ostream & outs()
Overwrite llvm::outs()
Definition SVFUtil.h:52

◆ strongUpdateOutFromIn()

virtual bool SVF::FlowSensitive::strongUpdateOutFromIn ( const SVFGNode node,
NodeID  singleton 
)
inlineprotectedvirtual

Handle strong updates.

Definition at line 165 of file FlowSensitive.h.

166 {
167 return getDFPTDataTy()->updateAllDFOutFromIn(node->getId(),singleton,true);
168 }

◆ svfgStat()

void SVF::FlowSensitive::svfgStat ( )
protected

◆ unionPtsFromIn()

virtual bool SVF::FlowSensitive::unionPtsFromIn ( const SVFGNode stmt,
NodeID  srcVar,
NodeID  dstVar 
)
inlineprotectedvirtual

Definition at line 201 of file FlowSensitive.h.

202 {
203 return getDFPTDataTy()->updateTLVPts(stmt->getId(),srcVar,dstVar);
204 }

◆ unionPtsFromTop()

virtual bool SVF::FlowSensitive::unionPtsFromTop ( const SVFGNode stmt,
NodeID  srcVar,
NodeID  dstVar 
)
inlineprotectedvirtual

Definition at line 205 of file FlowSensitive.h.

206 {
207 return getDFPTDataTy()->updateATVPts(srcVar,stmt->getId(),dstVar);
208 }

◆ updateCallGraph()

bool FlowSensitive::updateCallGraph ( const CallSiteToFunPtrMap callsites)
overrideprotectedvirtual

Update call graph.

Update call graph.

Update call graph

Reimplemented from SVF::BVDataPTAImpl.

Definition at line 684 of file FlowSensitive.cpp.

685{
686 double start = stat->getClk();
689
690 // Bound the new edges by the Andersen's call graph.
691 // TODO: we want this to be an assertion eventually.
693 for (typename CallEdgeMap::value_type &csfs : newEdges)
694 {
695 const CallICFGNode *potentialCallSite = csfs.first;
697
698 // Check this callsite even calls anything per Andersen's.
699 typename CallEdgeMap::const_iterator andersFunctionSetIt
702 {
703 potentialFunctionSet.clear();
704 }
705
707 for (FunctionSet::iterator potentialFunctionIt = potentialFunctionSet.begin();
709 {
712 {
713 // potentialFunction is not in the Andersen's call graph -- remove it.
715 }
716 else
717 {
718 // potentialFunction is in the Andersen's call graph -- keep it..
720 }
721 }
722 }
723
726
728
729 double end = stat->getClk();
731 return (!newEdges.empty());
732}
virtual void onTheFlyCallGraphSolve(const CallSiteToFunPtrMap &callsites, CallEdgeMap &newEdges)
On the fly call graph construction.
virtual void updateConnectedNodes(const SVFGEdgeSetTy &edges)
Update nodes connected during updating call graph.
SVFG::SVFGEdgeSetTy SVFGEdgeSetTy
void connectCallerAndCallee(const CallEdgeMap &newEdges, SVFGEdgeSetTy &edges)
Connect nodes in SVFG.
OrderedMap< const CallICFGNode *, FunctionSet > CallEdgeMap
CallEdgeMap & getIndCallMap()
Get callees from an indirect callsite.

◆ updateConnectedNodes()

void FlowSensitive::updateConnectedNodes ( const SVFGEdgeSetTy edges)
protectedvirtual

Update nodes connected during updating call graph.

Push nodes connected during update call graph into worklist so they will be solved during next iteration.

If this is a formal-param or actual-ret node, we need to solve this phi node in next iteration

If this is a formal-in or actual-out node, we need to propagate points-to information from its predecessor node.

If this is a field-insensitive obj, propagate all field node's pts

Reimplemented in SVF::VersionedFlowSensitive.

Definition at line 757 of file FlowSensitive.cpp.

758{
759 for (const SVFGEdge* edge : edges)
760 {
761 SVFGNode* dstNode = edge->getDstNode();
762 if (SVFUtil::isa<PHISVFGNode>(dstNode))
763 {
766 pushIntoWorklist(dstNode->getId());
767 }
768 else if (SVFUtil::isa<FormalINSVFGNode, ActualOUTSVFGNode>(dstNode))
769 {
772 bool changed = false;
773
774 SVFGNode* srcNode = edge->getSrcNode();
775
776 const NodeBS& pts = SVFUtil::cast<IndirectSVFGEdge>(edge)->getPointsTo();
777 for (NodeBS::iterator ptdIt = pts.begin(), ptdEit = pts.end(); ptdIt != ptdEit; ++ptdIt)
778 {
779 NodeID ptd = *ptdIt;
780
782 changed = true;
783
785 {
788 for (NodeBS::iterator fieldIt = allFields.begin(), fieldEit = allFields.end();
790 {
792 changed = true;
793 }
794 }
795 }
796
797 if (changed)
798 pushIntoWorklist(dstNode->getId());
799 }
800 }
801}
bool propVarPtsAfterCGUpdated(NodeID var, const SVFGNode *src, const SVFGNode *dst)
virtual void pushIntoWorklist(NodeID id)
Definition WPASolver.h:156

◆ updateInFromIn()

virtual bool SVF::FlowSensitive::updateInFromIn ( const SVFGNode srcStmt,
NodeID  srcVar,
const SVFGNode dstStmt,
NodeID  dstVar 
)
inlineprotectedvirtual

Definition at line 192 of file FlowSensitive.h.

193 {
194 return getDFPTDataTy()->updateDFInFromIn(srcStmt->getId(),srcVar, dstStmt->getId(),dstVar);
195 }

◆ updateInFromOut()

virtual bool SVF::FlowSensitive::updateInFromOut ( const SVFGNode srcStmt,
NodeID  srcVar,
const SVFGNode dstStmt,
NodeID  dstVar 
)
inlineprotectedvirtual

Definition at line 196 of file FlowSensitive.h.

197 {
198 return getDFPTDataTy()->updateDFInFromOut(srcStmt->getId(),srcVar, dstStmt->getId(),dstVar);
199 }

◆ updateOutFromIn()

bool SVF::FlowSensitive::updateOutFromIn ( const SVFGNode srcStmt,
NodeID  srcVar,
const SVFGNode dstStmt,
NodeID  dstVar 
)
inlineprotected

Update data-flow points-to data.

Definition at line 188 of file FlowSensitive.h.

189 {
190 return getDFPTDataTy()->updateDFOutFromIn(srcStmt->getId(),srcVar, dstStmt->getId(),dstVar);
191 }

◆ weakUpdateOutFromIn()

virtual bool SVF::FlowSensitive::weakUpdateOutFromIn ( const SVFGNode node)
inlineprotectedvirtual

Handle weak updates.

Definition at line 160 of file FlowSensitive.h.

161 {
162 return getDFPTDataTy()->updateAllDFOutFromIn(node->getId(),0,false);
163 }

Friends And Related Symbol Documentation

◆ FlowSensitiveStat

Definition at line 50 of file FlowSensitive.h.

Member Data Documentation

◆ addrTime

double SVF::FlowSensitive::addrTime
protected

time of handling address edges

Definition at line 306 of file FlowSensitive.h.

◆ ander

AndersenWaveDiff* SVF::FlowSensitive::ander
protected

Definition at line 278 of file FlowSensitive.h.

◆ candidateMappings

std::vector<std::pair<hclust_fast_methods, std::vector<NodeID> > > SVF::FlowSensitive::candidateMappings
protected

Save candidate mappings for evaluation's sake.

Definition at line 281 of file FlowSensitive.h.

◆ copyTime

double SVF::FlowSensitive::copyTime
protected

time of handling copy edges

Definition at line 307 of file FlowSensitive.h.

◆ directPropaTime

double SVF::FlowSensitive::directPropaTime
protected

time of points-to propagation of address-taken objects

Definition at line 303 of file FlowSensitive.h.

◆ fspta

std::unique_ptr< FlowSensitive > FlowSensitive::fspta
staticprotected

Definition at line 276 of file FlowSensitive.h.

◆ gepTime

double SVF::FlowSensitive::gepTime
protected

time of handling gep edges

Definition at line 308 of file FlowSensitive.h.

◆ indirectPropaTime

double SVF::FlowSensitive::indirectPropaTime
protected

time of points-to propagation of top-level pointers

Definition at line 304 of file FlowSensitive.h.

◆ loadTime

double SVF::FlowSensitive::loadTime
protected

time of load edges

Definition at line 309 of file FlowSensitive.h.

◆ maxSCCSize

u32_t SVF::FlowSensitive::maxSCCSize
protected

Number of processed mssa node.

Definition at line 295 of file FlowSensitive.h.

◆ memSSA

SVFGBuilder SVF::FlowSensitive::memSSA
protected

Definition at line 277 of file FlowSensitive.h.

◆ numOfNodesInSCC

u32_t SVF::FlowSensitive::numOfNodesInSCC
protected

Definition at line 297 of file FlowSensitive.h.

◆ numOfProcessedActualParam

u32_t SVF::FlowSensitive::numOfProcessedActualParam
protected

Number of processed Store node.

Definition at line 291 of file FlowSensitive.h.

◆ numOfProcessedAddr

u32_t SVF::FlowSensitive::numOfProcessedAddr
protected

Statistics.

Definition at line 285 of file FlowSensitive.h.

◆ numOfProcessedCopy

u32_t SVF::FlowSensitive::numOfProcessedCopy
protected

Number of processed Addr node.

Definition at line 286 of file FlowSensitive.h.

◆ numOfProcessedFormalRet

u32_t SVF::FlowSensitive::numOfProcessedFormalRet
protected

Number of processed actual param node.

Definition at line 292 of file FlowSensitive.h.

◆ numOfProcessedGep

u32_t SVF::FlowSensitive::numOfProcessedGep
protected

Number of processed Copy node.

Definition at line 287 of file FlowSensitive.h.

◆ numOfProcessedLoad

u32_t SVF::FlowSensitive::numOfProcessedLoad
protected

Number of processed Phi node.

Definition at line 289 of file FlowSensitive.h.

◆ numOfProcessedMSSANode

u32_t SVF::FlowSensitive::numOfProcessedMSSANode
protected

Number of processed formal ret node.

Definition at line 293 of file FlowSensitive.h.

◆ numOfProcessedPhi

u32_t SVF::FlowSensitive::numOfProcessedPhi
protected

Number of processed Gep node.

Definition at line 288 of file FlowSensitive.h.

◆ numOfProcessedStore

u32_t SVF::FlowSensitive::numOfProcessedStore
protected

Number of processed Load node.

Definition at line 290 of file FlowSensitive.h.

◆ numOfSCC

u32_t SVF::FlowSensitive::numOfSCC
protected

Definition at line 296 of file FlowSensitive.h.

◆ phiTime

double SVF::FlowSensitive::phiTime
protected

time of phi nodes.

Definition at line 311 of file FlowSensitive.h.

◆ processTime

double SVF::FlowSensitive::processTime
protected

time of processNode.

Definition at line 301 of file FlowSensitive.h.

◆ propagationTime

double SVF::FlowSensitive::propagationTime
protected

time of points-to propagation.

Definition at line 302 of file FlowSensitive.h.

◆ sccTime

double SVF::FlowSensitive::sccTime
protected

time of SCC detection.

Definition at line 300 of file FlowSensitive.h.

◆ solveTime

double SVF::FlowSensitive::solveTime
protected

time of solve.

Definition at line 299 of file FlowSensitive.h.

◆ storeTime

double SVF::FlowSensitive::storeTime
protected

time of store edges

Definition at line 310 of file FlowSensitive.h.

◆ svfg

SVFG* SVF::FlowSensitive::svfg
protected

Definition at line 244 of file FlowSensitive.h.

◆ svfgHasSU

NodeBS SVF::FlowSensitive::svfgHasSU
protected

Definition at line 314 of file FlowSensitive.h.

◆ updateCallGraphTime

double SVF::FlowSensitive::updateCallGraphTime
protected

time of updating call graph

Definition at line 312 of file FlowSensitive.h.

◆ updateTime

double SVF::FlowSensitive::updateTime
protected

time of strong/weak updates.

Definition at line 305 of file FlowSensitive.h.


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