Static Value-Flow Analysis
Loading...
Searching...
No Matches
svf-ex.cpp
Go to the documentation of this file.
1//===- svf-ex.cpp -- A driver example of SVF-------------------------------------//
2//
3// SVF: Static Value-Flow Analysis
4//
5// Copyright (C) <2013-> <Yulei Sui>
6//
7
8// This program is free software: you can redistribute it and/or modify
9// it under the terms of the GNU General Public License as published by
10// the Free Software Foundation, either version 3 of the License, or
11// (at your option) any later version.
12
13// This program is distributed in the hope that it will be useful,
14// but WITHOUT ANY WARRANTY; without even the implied warranty of
15// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16// GNU General Public License for more details.
17
18// You should have received a copy of the GNU General Public License
19// along with this program. If not, see <http://www.gnu.org/licenses/>.
20//
21//===-----------------------------------------------------------------------===//
22
23/*
24 // A driver program of SVF including usages of SVF APIs
25 //
26 // Author: Yulei Sui,
27 */
28
30#include "Graphs/SVFG.h"
31#include "SVF-LLVM/LLVMUtil.h"
33#include "Util/CommandLine.h"
34#include "Util/Options.h"
35#include "WPA/Andersen.h"
36
37using namespace llvm;
38using namespace std;
39using namespace SVF;
40
45{
46 return pta->alias(v1->getId(), v2->getId());
47}
48
52std::string printPts(PointerAnalysis* pta, const SVFVar* svfval)
53{
54
55 std::string str;
57
58 NodeID pNodeId = svfval->getId();
59 const PointsTo& pts = pta->getPts(pNodeId);
60 for (PointsTo::iterator ii = pts.begin(), ie = pts.end();
61 ii != ie; ii++)
62 {
63 rawstr << " " << *ii << " ";
64 PAGNode* targetObj = pta->getPAG()->getGNode(*ii);
65 if(targetObj->hasValue())
66 {
67 rawstr << "(" << targetObj->getValue()->toString() << ")\t ";
68 }
69 }
70
71 return rawstr.str();
72
73}
77void traverseOnICFG(ICFG* icfg, const ICFGNode* iNode)
78{
81 worklist.push(iNode);
82
84 while (!worklist.empty())
85 {
86 const ICFGNode* vNode = worklist.pop();
87 for (ICFGNode::const_iterator it = vNode->OutEdgeBegin(), eit =
88 vNode->OutEdgeEnd(); it != eit; ++it)
89 {
90 ICFGEdge* edge = *it;
91 ICFGNode* succNode = edge->getDstNode();
92 if (visited.find(succNode) == visited.end())
93 {
94 visited.insert(succNode);
95 worklist.push(succNode);
96 }
97 }
98 }
99}
100
101void dummyVisit(const VFGNode* node)
102{
103
104}
108void traverseOnVFG(const SVFG* vfg, const SVFVar* svfval)
109{
110 if (!vfg->hasDefSVFGNode(svfval))
111 return;
112 const VFGNode* vNode = vfg->getDefSVFGNode(svfval);
114 Set<const VFGNode*> visited;
115 worklist.push(vNode);
116
118 while (!worklist.empty())
119 {
120 const VFGNode* vNode = worklist.pop();
121 for (VFGNode::const_iterator it = vNode->OutEdgeBegin(), eit =
122 vNode->OutEdgeEnd(); it != eit; ++it)
123 {
124 VFGEdge* edge = *it;
125 VFGNode* succNode = edge->getDstNode();
126 if (visited.find(succNode) == visited.end())
127 {
128 visited.insert(succNode);
129 worklist.push(succNode);
130 }
131 }
132 }
133
135 for(Set<const VFGNode*>::const_iterator it = visited.begin(), eit = visited.end(); it!=eit; ++it)
136 {
137 const VFGNode* node = *it;
138 dummyVisit(node);
142 }
143}
144
145int main(int argc, char ** argv)
146{
147
148 std::vector<std::string> moduleNameVec;
150 argc, argv, "Whole Program Points-to Analysis", "[options] <input-bitcode...>"
151 );
152
153 if (Options::WriteAnder() == "ir_annotator")
154 {
156 }
157
159
161 SVFIRBuilder builder(svfModule);
162 SVFIR* pag = builder.build();
163
166
167
169 PTACallGraph* callgraph = ander->getCallGraph();
170
172 ICFG* icfg = pag->getICFG();
173
175 VFG* vfg = new VFG(callgraph);
176
179 SVFG* svfg = svfBuilder.buildFullSVFG(ander);
180
182 if (Options::PTSPrint())
183 {
184 for (const auto& it : *svfg)
185 {
186 const SVFGNode* node = it.second;
187 if (node->getValue())
188 {
189 traverseOnVFG(svfg, node->getValue());
191 printPts(ander, node->getValue());
192 for (const SVFGEdge* edge : node->getOutEdges())
193 {
194 const SVFGNode* node2 = edge->getDstNode();
195 if (node2->getValue())
196 aliasQuery(ander, node->getValue(), node2->getValue());
197 }
198 }
199 }
200 }
201
203 if (Options::PTSPrint())
204 {
205 for (const auto& it : *icfg)
206 {
207 const ICFGNode* node = it.second;
208 traverseOnICFG(icfg, node);
209 }
210 }
211
212 // clean up memory
213 delete vfg;
216
219 llvm::llvm_shutdown();
220 return 0;
221}
222
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
bool push(const Data &data)
Definition WorkList.h:165
bool empty() const
Definition WorkList.h:146
NodeType * getGNode(NodeID id) const
Get a node.
const GEdgeSetTy & getOutEdges() const
ICFGEdge::ICFGEdgeSetTy::const_iterator const_iterator
Definition ICFGNode.h:62
static LLVMModuleSet * getLLVMModuleSet()
Definition LLVMModule.h:122
static void releaseLLVMModuleSet()
Definition LLVMModule.h:129
static void preProcessBCs(std::vector< std::string > &moduleNameVec)
static SVFModule * buildSVFModule(Module &mod)
void dumpModulesToFile(const std::string &suffix)
static const Option< bool > PTSPrint
Definition Options.h:116
static const Option< std::string > WriteAnder
Definition Options.h:212
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
PTACallGraph * getCallGraph() const
Return call graph.
virtual AliasResult alias(const SVFValue *V1, const SVFValue *V2)=0
Interface exposed to users of our pointer analysis, given Value infos.
static void releaseSVFIR()
Definition SVFIR.h:124
ICFG * getICFG() const
Definition SVFIR.h:172
std::string toString() const
Needs to be implemented by a SVF front end.
Definition LLVMUtil.cpp:721
const SVFValue * getValue() const
Get/has methods of the components.
virtual const SVFVar * getValue() const
Return the corresponding LLVM value, if possible, nullptr otherwise.
Definition VFGNode.h:85
VFGEdge::VFGEdgeSetTy::const_iterator const_iterator
Definition VFGNode.h:55
Definition VFG.h:51
for isBitcode
Definition BasicTypes.h:68
u32_t NodeID
Definition GeneralType.h:55
AliasResult
Definition SVFType.h:527
llvm::IRBuilder IRBuilder
Definition BasicTypes.h:74
std::unordered_set< Key, Hash, KeyEqual, Allocator > Set
Definition GeneralType.h:96
void traverseOnICFG(ICFG *icfg, const ICFGNode *iNode)
Definition svf-ex.cpp:77
int main(int argc, char **argv)
Definition svf-ex.cpp:145
std::string printPts(PointerAnalysis *pta, const SVFVar *svfval)
Definition svf-ex.cpp:52
SVF::AliasResult aliasQuery(PointerAnalysis *pta, const SVFVar *v1, const SVFVar *v2)
Definition svf-ex.cpp:44
void dummyVisit(const VFGNode *node)
Definition svf-ex.cpp:101
void traverseOnVFG(const SVFG *vfg, const SVFVar *svfval)
Definition svf-ex.cpp:108