Static Value-Flow Analysis
Loading...
Searching...
No Matches
Functions
svf-ex.cpp File Reference
#include "AE/Core/AbstractState.h"
#include "Graphs/SVFG.h"
#include "MSSA/SVFGBuilder.h"
#include "SVF-LLVM/LLVMUtil.h"
#include "SVF-LLVM/SVFIRBuilder.h"
#include "Util/CommandLine.h"
#include "Util/Options.h"
#include "WPA/Andersen.h"
#include <llvm/Support/ManagedStatic.h>

Go to the source code of this file.

Functions

SVF::AliasResult aliasQuery (PointerAnalysis *pta, const SVFVar *v1, const SVFVar *v2)
 
std::string printPts (PointerAnalysis *pta, const SVFVar *svfval)
 
void traverseOnICFG (ICFG *icfg, const ICFGNode *iNode)
 
void dummyVisit (const VFGNode *node)
 
void traverseOnVFG (const SVFG *vfg, const ValVar *svfval)
 
int main (int argc, char **argv)
 

Function Documentation

◆ aliasQuery()

SVF::AliasResult aliasQuery ( PointerAnalysis pta,
const SVFVar v1,
const SVFVar v2 
)

An example to query alias results of two SVF values

Definition at line 46 of file svf-ex.cpp.

47{
48 return pta->alias(v1->getId(), v2->getId());
49}
virtual AliasResult alias(const SVFVar *V1, const SVFVar *V2)=0
Interface exposed to users of our pointer analysis, given Value infos.
llvm::IRBuilder IRBuilder
Definition BasicTypes.h:76

◆ dummyVisit()

void dummyVisit ( const VFGNode node)

Definition at line 100 of file svf-ex.cpp.

101{
102
103}

◆ main()

int main ( int  argc,
char **  argv 
)

Build Program Assignment Graph (SVFIR)

Create Andersen's pointer analysis

Call Graph

ICFG

Value-Flow Graph (VFG)

Sparse value-flow graph (SVFG)

Collect uses of an LLVM Value

Print points-to information

Collect all successor nodes on ICFG

Definition at line 144 of file svf-ex.cpp.

145{
146
147 std::vector<std::string> moduleNameVec;
149 argc, argv, "Whole Program Points-to Analysis", "[options] <input-bitcode...>"
150 );
151
154
157 SVFIR* pag = builder.build();
158
161
162
164 CallGraph* callgraph = ander->getCallGraph();
165
167 ICFG* icfg = pag->getICFG();
168
170 VFG* vfg = new VFG(callgraph);
171
174 SVFG* svfg = svfBuilder.buildFullSVFG(ander);
175
177 if (Options::PTSPrint())
178 {
179 for (const auto& it : *svfg)
180 {
181 const SVFGNode* node = it.second;
182 if (node->getValue())
183 {
184 if (const ValVar* valVar = SVFUtil::dyn_cast<ValVar>(node->getValue()))
185 {
186 traverseOnVFG(svfg, valVar);
187 }
189 printPts(ander, node->getValue());
190 for (const SVFGEdge* edge : node->getOutEdges())
191 {
192 const SVFGNode* node2 = edge->getDstNode();
193 if (node2->getValue())
194 aliasQuery(ander, node->getValue(), node2->getValue());
195 }
196 }
197 }
198 }
199
201 if (Options::PTSPrint())
202 {
203 for (const auto& it : *icfg)
204 {
205 const ICFGNode* node = it.second;
206 traverseOnICFG(icfg, node);
207 }
208 }
209
210 // clean up memory
211 delete vfg;
214
217#if LLVM_VERSION_MAJOR < 21
218 llvm::llvm_shutdown();
219#endif
220 return 0;
221}
static std::vector< std::string > parseOptions(int argc, char *argv[], std::string description, std::string callFormat)
Definition CommandLine.h:75
static AndersenWaveDiff * createAndersenWaveDiff(SVFIR *_pag)
Create an singleton instance directly instead of invoking llvm pass manager.
Definition Andersen.h:408
static void releaseAndersenWaveDiff()
Definition Andersen.h:418
static LLVMModuleSet * getLLVMModuleSet()
Definition LLVMModule.h:133
static void releaseLLVMModuleSet()
Definition LLVMModule.h:140
static void preProcessBCs(std::vector< std::string > &moduleNameVec)
static void buildSVFModule(Module &mod)
void dumpModulesToFile(const std::string &suffix)
static const Option< bool > PTSPrint
Definition Options.h:112
CallGraph * getCallGraph() const
Return call graph.
static void releaseSVFIR()
Definition SVFIR.h:128
ICFG * getICFG() const
Definition SVFIR.h:231
virtual const SVFVar * getValue() const
Return the corresponding LLVM value, if possible, nullptr otherwise.
Definition VFGNode.h:85
Definition VFG.h:51
void traverseOnICFG(ICFG *icfg, const ICFGNode *iNode)
Definition svf-ex.cpp:76
std::string printPts(PointerAnalysis *pta, const SVFVar *svfval)
Definition svf-ex.cpp:54
SVF::AliasResult aliasQuery(PointerAnalysis *pta, const SVFVar *v1, const SVFVar *v2)
Definition svf-ex.cpp:46
void traverseOnVFG(const SVFG *vfg, const ValVar *svfval)
Definition svf-ex.cpp:107

◆ printPts()

std::string printPts ( PointerAnalysis pta,
const SVFVar svfval 
)

An example to print points-to set of an SVF value

Definition at line 54 of file svf-ex.cpp.

55{
56
57 std::string str;
59
60 NodeID pNodeId = svfval->getId();
61 const PointsTo& pts = pta->getPts(pNodeId);
62 for (PointsTo::iterator ii = pts.begin(), ie = pts.end();
63 ii != ie; ii++)
64 {
65 rawstr << " " << *ii << " ";
66 PAGNode* targetObj = pta->getPAG()->getGNode(*ii);
67 rawstr << "(" << targetObj->toString() << ")\t ";
68 }
69
70 return rawstr.str();
71
72}
NodeType * getGNode(NodeID id) const
Get a node.
virtual const PointsTo & getPts(NodeID ptr)=0
Get points-to targets of a pointer. It needs to be implemented in child class.
SVFIR * getPAG() const
virtual const std::string toString() const
Get string representation.
u32_t NodeID
Definition GeneralType.h:76

◆ traverseOnICFG()

void traverseOnICFG ( ICFG icfg,
const ICFGNode iNode 
)

An example to query/collect all successor nodes from a ICFGNode (iNode) along control-flow graph (ICFG)

Traverse along VFG

Definition at line 76 of file svf-ex.cpp.

77{
80 worklist.push(iNode);
81
83 while (!worklist.empty())
84 {
85 const ICFGNode* vNode = worklist.pop();
86 for (ICFGNode::const_iterator it = vNode->OutEdgeBegin(), eit =
87 vNode->OutEdgeEnd(); it != eit; ++it)
88 {
89 ICFGEdge* edge = *it;
90 ICFGNode* succNode = edge->getDstNode();
91 if (visited.find(succNode) == visited.end())
92 {
93 visited.insert(succNode);
94 worklist.push(succNode);
95 }
96 }
97 }
98}
bool push(const Data &data)
Definition WorkList.h:180
bool empty() const
Definition WorkList.h:161
ICFGEdge::ICFGEdgeSetTy::const_iterator const_iterator
Definition ICFGNode.h:61

◆ traverseOnVFG()

void traverseOnVFG ( const SVFG vfg,
const ValVar svfval 
)

An example to query/collect all the uses of a definition of a value along value-flow graph (VFG)

Traverse along VFG

Collect all LLVM Values

can only query VFGNode involving top-level pointers (starting with % or @ in LLVM IR) PAGNode* pNode = vfg->getLHSTopLevPtr(node); Value* val = pNode->getValue();

Definition at line 107 of file svf-ex.cpp.

108{
109 if (!vfg->hasDefSVFGNode(svfval))
110 return;
111 const VFGNode* vNode = vfg->getDefSVFGNode(svfval);
113 Set<const VFGNode*> visited;
114 worklist.push(vNode);
115
117 while (!worklist.empty())
118 {
119 const VFGNode* vNode = worklist.pop();
120 for (VFGNode::const_iterator it = vNode->OutEdgeBegin(), eit =
121 vNode->OutEdgeEnd(); it != eit; ++it)
122 {
123 VFGEdge* edge = *it;
124 VFGNode* succNode = edge->getDstNode();
125 if (visited.find(succNode) == visited.end())
126 {
127 visited.insert(succNode);
128 worklist.push(succNode);
129 }
130 }
131 }
132
134 for(Set<const VFGNode*>::const_iterator it = visited.begin(), eit = visited.end(); it!=eit; ++it)
135 {
136 const VFGNode* node = *it;
137 dummyVisit(node);
141 }
142}
bool hasDefSVFGNode(const ValVar *valVar) const
Given a valVar, return whether it has definition site.
Definition SVFG.h:177
const SVFGNode * getDefSVFGNode(const ValVar *valVar) const
Given a valVar, return its definition site.
Definition SVFG.h:171
VFGEdge::VFGEdgeSetTy::const_iterator const_iterator
Definition VFGNode.h:55
std::unordered_set< Key, Hash, KeyEqual, Allocator > Set
Definition GeneralType.h:51
void dummyVisit(const VFGNode *node)
Definition svf-ex.cpp:100