Static Value-Flow Analysis
Loading...
Searching...
No Matches
SVFIR.cpp
Go to the documentation of this file.
1//===- SVFIR.cpp -- IR 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 Affero 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 Affero General Public License for more details.
17
18// You should have received a copy of the GNU Affero General Public License
19// along with this program. If not, see <http://www.gnu.org/licenses/>.
20//
21//===----------------------------------------------------------------------===//
22
23/*
24 * SVFIR.cpp
25 *
26 * Created on: 31, 12, 2021
27 * Author: Yulei Sui
28 */
29
30#include "Util/Options.h"
31#include "SVFIR/SVFIR.h"
32#include "Graphs/CallGraph.h"
33
34using namespace SVF;
35using namespace SVFUtil;
36
37
38std::unique_ptr<SVFIR> SVFIR::pag;
39
40std::string SVFIR::pagReadFromTxt = "";
41
45
46
47const FunObjVar *SVFIR::getFunObjVar(const std::string &name)
48{
49 for (const auto &item: *callGraph)
50 {
51 if (item.second->getName() == name)
52 {
53 return item.second->getFunction();
54 }
55 }
56 return nullptr;
57}
58
59
64{
65 SVFVar* srcNode = getGNode(src);
66 SVFVar* dstNode = getGNode(dst);
68 return nullptr;
69 else
70 {
73 return addrPE;
74 }
75}
77{
79 addEdge(edge->getRHSVar(),edge->getLHSVar(), edge);
80}
81
86{
87 SVFVar* srcNode = getGNode(src);
88 SVFVar* dstNode = getGNode(dst);
90 return nullptr;
91 else
92 {
95 return copyPE;
96 }
97}
98
100{
102 addEdge(edge->getRHSVar(),edge->getLHSVar(), edge);
103}
104
109{
111 SVFVar* resNode = getGNode(res);
112 PHINodeMap::iterator it = phiNodeMap.find(resNode);
113 if(it == phiNodeMap.end())
114 {
115 PhiStmt* phi = new PhiStmt(resNode, {opNode}, {pred});
117 return phi;
118 }
119 else
120 {
121 it->second->addOpVar(opNode,pred);
123 return nullptr;
124 }
125}
126
128{
129 SVFVar* opNode = src;
130 SVFVar* resNode = dst;
131
135
136}
137
142{
145 SVFVar* dstNode = getGNode(res);
146 SVFVar* condNode = getGNode(cond);
148 return nullptr;
149 else
150 {
151 std::vector<SVFVar*> opnds = {op1Node, op2Node};
154 return select;
155 }
156}
157
159{
161 addEdge(src, dst, edge);
162}
163
168{
171 SVFVar* dstNode = getGNode(dst);
173 return nullptr;
174 else
175 {
176 std::vector<SVFVar*> opnds = {op1Node, op2Node};
177 CmpStmt* cmp = new CmpStmt(dstNode, opnds, predicate);
179 return cmp;
180 }
181}
182
184{
186 addEdge(src, dst, edge);
187}
188
189
194{
197 SVFVar* dstNode = getGNode(dst);
199 return nullptr;
200 else
201 {
202 std::vector<SVFVar*> opnds = {op1Node, op2Node};
205 return binaryOP;
206 }
207}
208
210{
212 addEdge(src, dst, edge);
213}
218{
219 SVFVar* srcNode = getGNode(src);
220 SVFVar* dstNode = getGNode(dst);
222 return nullptr;
223 else
224 {
227 return unaryOP;
228 }
229}
230
232{
234 addEdge(src, dst, edge);
235}
236
237/*
238* Add BranchStmt
239*/
253
255{
257 addEdge(src, dst, edge);
258}
259
264{
265 SVFVar* srcNode = getGNode(src);
266 SVFVar* dstNode = getGNode(dst);
268 return nullptr;
269 else
270 {
273 return loadPE;
274 }
275}
276
278{
280 addEdge(edge->getRHSVar(),edge->getLHSVar(), edge);
281}
282
288{
289 SVFVar* srcNode = getGNode(src);
290 SVFVar* dstNode = getGNode(dst);
292 return nullptr;
293 else
294 {
295 StoreStmt* storePE = new StoreStmt(srcNode, dstNode, curVal);
297 return storePE;
298 }
299}
300
302{
304 addEdge(src,dst, edge);
305}
306
311{
312 SVFVar* srcNode = getGNode(src);
313 SVFVar* dstNode = getGNode(dst);
315 return nullptr;
316 else
317 {
318 CallPE* callPE = new CallPE(srcNode, dstNode, cs,entry);
320 return callPE;
321 }
322}
323
325{
327 addEdge(src,dst, edge);
328}
329
334{
335 SVFVar* srcNode = getGNode(src);
336 SVFVar* dstNode = getGNode(dst);
338 return nullptr;
339 else
340 {
341 RetPE* retPE = new RetPE(srcNode, dstNode, cs, exit);
342 addRetPE(retPE,srcNode,dstNode);
343 return retPE;
344 }
345}
346
348{
350 addEdge(src, dst, edge);
351}
352
357{
359 return pag->addAddrStmt(pag->getBlackHoleNode(), node);
360 else
361 return pag->addCopyStmt(pag->getNullPtr(), node, CopyStmt::COPYVAL);
362}
363
368{
369 SVFVar* srcNode = getGNode(src);
370 SVFVar* dstNode = getGNode(dst);
372 return nullptr;
373 else
374 {
375 TDForkPE* forkPE = new TDForkPE(srcNode, dstNode, cs, entry);
377 return forkPE;
378 }
379}
380
385{
386 SVFVar* srcNode = getGNode(src);
387 SVFVar* dstNode = getGNode(dst);
389 return nullptr;
390 else
391 {
392 TDJoinPE* joinPE = new TDJoinPE(srcNode, dstNode, cs, exit);
394 return joinPE;
395 }
396}
397
398
405{
406
407 SVFVar* node = getGNode(src);
408 if (!constGep || node->hasIncomingVariantGepEdge())
409 {
412 return addVariantGepStmt(src, dst, ap);
413 }
414 else
415 {
416 return addNormalGepStmt(src, dst, ap);
417 }
418}
419
424{
425 SVFVar* baseNode = getGNode(src);
426 SVFVar* dstNode = getGNode(dst);
428 return nullptr;
429 else
430 {
431 GepStmt* gepPE = new GepStmt(baseNode, dstNode, ap);
433 return gepPE;
434 }
435}
436
438{
439 SVFVar* baseNode = gepPE->getRHSVar();
440 SVFVar* dstNode = gepPE->getLHSVar();
443
444}
445
451{
452 SVFVar* baseNode = getGNode(src);
453 SVFVar* dstNode = getGNode(dst);
455 return nullptr;
456 else
457 {
458 GepStmt* gepPE = new GepStmt(baseNode, dstNode, ap, true);
461 return gepPE;
462 }
463}
464
465
466
472{
473 NodeID base = baseVar->getId();
474 //assert(findPAGNode(i) == false && "this node should not be created before");
475 assert(0==GepValObjMap[curInst].count(std::make_pair(base, ap))
476 && "this node should not be created before");
477 GepValObjMap[curInst][std::make_pair(base, ap)] = i;
478 GepValVar *node = new GepValVar(baseVar, i, ap, type, icn);
480 return addValNode(node);
481}
482
487{
488 SVFVar* node = pag->getGNode(id);
489 if (GepObjVar* gepNode = SVFUtil::dyn_cast<GepObjVar>(node))
490 return getGepObjVar(gepNode->getBaseObj(), gepNode->getConstantFieldIdx() + apOffset);
491 else if (BaseObjVar* baseNode = SVFUtil::dyn_cast<BaseObjVar>(node))
492 return getGepObjVar(baseNode, apOffset);
493 else if (DummyObjVar* baseNode = SVFUtil::dyn_cast<DummyObjVar>(node))
494 return getGepObjVar(baseNode, apOffset);
495 else
496 {
497 assert(false && "new gep obj node kind?");
498 return id;
499 }
500}
501
509{
510 NodeID base = baseObj->getId();
511
513 if (baseObj->isFieldInsensitive())
514 return getFIObjVar(baseObj);
515
516 APOffset newLS = pag->getModulusOffset(baseObj, apOffset);
517
518 // Base and first field are the same memory location.
519 if (Options::FirstFieldEqBase() && newLS == 0) return base;
520
521 NodeOffsetMap::iterator iter = GepObjVarMap.find(std::make_pair(base, newLS));
522 if (iter == GepObjVarMap.end())
523 {
526 }
527 else
528 return iter->second;
529
530}
531
533{
534 assert(0==GepObjVarMap.count(std::make_pair(base, apOffset))
535 && "this node should not be created before");
536 GepObjVarMap[std::make_pair(base, apOffset)] = gepObj->getId();
537 memToFieldsMap[base].set(gepObj->getId());
538 return addObjNode(gepObj);
539}
540
545{
546 //assert(findPAGNode(i) == false && "this node should not be created before");
547 NodeID base = baseObj->getId();
548 assert(0==GepObjVarMap.count(std::make_pair(base, apOffset))
549 && "this node should not be created before");
550 //ABTest
551 GepObjVar *node = new GepObjVar(baseObj, gepId, apOffset);
552 return addGepObjNode(node, base, apOffset);
553}
554
559{
560 NodeID base = obj->getId();
561 return memToFieldsMap[base];
562}
563
568{
569 const SVFVar* node = pag->getGNode(id);
570 assert(SVFUtil::isa<ObjVar>(node) && "need an object node");
572}
573
580{
581 const SVFVar* node = pag->getGNode(id);
582 assert(SVFUtil::isa<ObjVar>(node) && "need an object node");
583 const BaseObjVar* obj = getBaseObject(id);
584 if(obj->isFieldInsensitive())
585 {
586 NodeBS bs;
588 return bs;
589 }
590 else
591 return getAllFieldsObjVars(obj);
592}
593
598{
599 GepValueVarMap::const_iterator iter = GepValObjMap.find(curInst);
600 if(iter==GepValObjMap.end())
601 {
602 return UINT_MAX;
603 }
604 else
605 {
606 NodeAccessPathMap::const_iterator lit =
607 iter->second.find(std::make_pair(base, ap));
608 if (lit == iter->second.end())
609 return UINT_MAX;
610 else
611 return lit->second;
612 }
613}
614
615
620{
621 delete icfg;
622 icfg = nullptr;
623 delete chgraph;
624 chgraph = nullptr;
625 delete callGraph;
626 callGraph = nullptr;
627}
628
633{
634
635 outs() << "-------------------SVFIR------------------------------------\n";
636 SVFStmt::SVFStmtSetTy& addrs = pag->getSVFStmtSet(SVFStmt::Addr);
637 for (SVFStmt::SVFStmtSetTy::iterator iter = addrs.begin(), eiter =
638 addrs.end(); iter != eiter; ++iter)
639 {
640 outs() << (*iter)->getSrcID() << " -- Addr --> " << (*iter)->getDstID()
641 << "\n";
642 }
643
644 SVFStmt::SVFStmtSetTy& copys = pag->getSVFStmtSet(SVFStmt::Copy);
645 for (SVFStmt::SVFStmtSetTy::iterator iter = copys.begin(), eiter =
646 copys.end(); iter != eiter; ++iter)
647 {
648 outs() << (*iter)->getSrcID() << " -- Copy --> " << (*iter)->getDstID()
649 << "\n";
650 }
651
652 SVFStmt::SVFStmtSetTy& calls = pag->getSVFStmtSet(SVFStmt::Call);
653 for (SVFStmt::SVFStmtSetTy::iterator iter = calls.begin(), eiter =
654 calls.end(); iter != eiter; ++iter)
655 {
656 outs() << (*iter)->getSrcID() << " -- Call --> " << (*iter)->getDstID()
657 << "\n";
658 }
659
660 SVFStmt::SVFStmtSetTy& rets = pag->getSVFStmtSet(SVFStmt::Ret);
661 for (SVFStmt::SVFStmtSetTy::iterator iter = rets.begin(), eiter =
662 rets.end(); iter != eiter; ++iter)
663 {
664 outs() << (*iter)->getSrcID() << " -- Ret --> " << (*iter)->getDstID()
665 << "\n";
666 }
667
669 for (SVFStmt::SVFStmtSetTy::iterator iter = tdfks.begin(), eiter =
670 tdfks.end(); iter != eiter; ++iter)
671 {
672 outs() << (*iter)->getSrcID() << " -- ThreadFork --> "
673 << (*iter)->getDstID() << "\n";
674 }
675
677 for (SVFStmt::SVFStmtSetTy::iterator iter = tdjns.begin(), eiter =
678 tdjns.end(); iter != eiter; ++iter)
679 {
680 outs() << (*iter)->getSrcID() << " -- ThreadJoin --> "
681 << (*iter)->getDstID() << "\n";
682 }
683
684 SVFStmt::SVFStmtSetTy& ngeps = pag->getSVFStmtSet(SVFStmt::Gep);
685 for (SVFStmt::SVFStmtSetTy::iterator iter = ngeps.begin(), eiter =
686 ngeps.end(); iter != eiter; ++iter)
687 {
688 GepStmt* gep = SVFUtil::cast<GepStmt>(*iter);
689 if(gep->isVariantFieldGep())
690 outs() << (*iter)->getSrcID() << " -- VariantGep --> "
691 << (*iter)->getDstID() << "\n";
692 else
693 outs() << gep->getRHSVarID() << " -- Gep (" << gep->getConstantStructFldIdx()
694 << ") --> " << gep->getLHSVarID() << "\n";
695 }
696
697 SVFStmt::SVFStmtSetTy& loads = pag->getSVFStmtSet(SVFStmt::Load);
698 for (SVFStmt::SVFStmtSetTy::iterator iter = loads.begin(), eiter =
699 loads.end(); iter != eiter; ++iter)
700 {
701 outs() << (*iter)->getSrcID() << " -- Load --> " << (*iter)->getDstID()
702 << "\n";
703 }
704
706 for (SVFStmt::SVFStmtSetTy::iterator iter = stores.begin(), eiter =
707 stores.end(); iter != eiter; ++iter)
708 {
709 outs() << (*iter)->getSrcID() << " -- Store --> " << (*iter)->getDstID()
710 << "\n";
711 }
712 outs() << "----------------------------------------------------------\n";
713
714}
715
718{
719 // collect candidate pointers for demand-driven analysis
720 for (iterator nIter = begin(); nIter != end(); ++nIter)
721 {
722 NodeID nodeId = nIter->first;
723 // do not compute points-to for isolated node
724 if (isValidPointer(nodeId) == false)
725 continue;
727 }
728}
729/*
730 * If this is a dummy node or node does not have incoming edges and outgoing edges we assume it is not a pointer here.
731 * However, if it is a pointer and it is an argument of a function definition, we assume it is a pointer here.
732 */
734{
735 SVFVar* node = pag->getGNode(nodeId);
736
737 if(node->isPointer())
738 if (const ValVar* pVar = pag->getBaseValVar(nodeId))
739 if (const ArgValVar* arg = SVFUtil::dyn_cast<ArgValVar>(pVar))
740 if (!(arg->getParent()->isDeclaration()))
741 return true;
742
743 if ((node->getInEdges().empty() && node->getOutEdges().empty()))
744 return false;
745 return node->isPointer();
746}
747
749{
750 if (SVFUtil::isa<ValVar>(node))
751 {
752 if (isValidPointer(node->getId()))
753 {
754 const ValVar* baseVar = pag->getBaseValVar(node->getId());
755 if(!SVFUtil::isa<DummyValVar, BlackHoleValVar>(baseVar))
757 }
758 }
759 return false;
760}
761
769
771{
772 assert(node && "node cannot be nullptr.");
773 assert(hasGNode(node->getId()) == false &&
774 "This NodeID clashes here. Please check NodeIDAllocator. Switch "
775 "Strategy::DBUG to SEQ or DENSE");
776 return addNode(node);
777}
778
780{
781 assert(node && "node cannot be nullptr.");
782 assert(hasGNode(node->getId()) == false &&
783 "This NodeID clashes here. Please check NodeIDAllocator. Switch "
784 "Strategy::DBUG to SEQ or DENSE");
785 return addNode(node);
786}
787
789{
790 return addObjNode(node);
791}
newitem type
Definition cJSON.cpp:2739
const cJSON *const b
Definition cJSON.h:255
const char *const name
Definition cJSON.h:264
cJSON * item
Definition cJSON.h:222
int count
Definition cJSON.h:216
void setValue(T v)
Class representing a function argument variable in the SVFIR.
std::vector< std::pair< const ICFGNode *, s32_t > > SuccAndCondPairVec
bool hasGNode(NodeID id) const
Has a node.
IDToNodeMapTy::iterator iterator
Node Iterators.
NodeType * getGNode(NodeID id) const
Get a node.
const GEdgeSetTy & getOutEdges() const
const GEdgeSetTy & getInEdges() const
void setLLVMVarInstID(NodeID id)
Set the LLVM variable ID associated with this GepValVar.
SVFStmt * hasLabeledEdge(SVFVar *src, SVFVar *dst, SVFStmt::PEDGEK kind, const ICFGNode *cs)
Definition IRGraph.cpp:291
NodeID addNode(SVFVar *node)
Add a node into the graph.
Definition IRGraph.h:117
bool addEdge(SVFVar *src, SVFVar *dst, SVFStmt *edge)
Add an edge into the graph.
Definition IRGraph.cpp:253
SVFStmt * hasNonlabeledEdge(SVFVar *src, SVFVar *dst, SVFStmt::PEDGEK kind)
Definition IRGraph.cpp:268
static NodeIDAllocator * get(void)
Return (singleton) allocator.
NodeID allocateGepObjectId(NodeID base, u32_t offset, u32_t maxFieldLimit)
static const Option< bool > FirstFieldEqBase
Definition Options.h:100
static Option< bool > HandBlackHole
Definition Options.h:99
static const Option< u32_t > MaxFieldLimit
Maximum number of field derivations for an object.
Definition Options.h:35
GepStmt * addVariantGepStmt(NodeID src, NodeID dst, const AccessPath &ap)
Add Variant(Gep) edge.
Definition SVFIR.cpp:450
NodeOffsetMap GepObjVarMap
Map a pair<base,off> to a gep obj node id.
Definition SVFIR.h:83
CopyStmt * addCopyStmt(NodeID src, NodeID dst, CopyStmt::CopyKind type)
Add Copy edge.
Definition SVFIR.cpp:85
NodeID getGepValVar(NodeID curInst, NodeID base, const AccessPath &ap) const
Due to constraint expression, curInst is used to distinguish different instructions (e....
Definition SVFIR.cpp:597
RetPE * addRetPE(NodeID src, NodeID dst, const CallICFGNode *cs, const FunExitICFGNode *exit)
Add Return edge.
Definition SVFIR.cpp:333
GepStmt * addGepStmt(NodeID src, NodeID dst, const AccessPath &ap, bool constGep)
Add Gep edge.
Definition SVFIR.cpp:404
void print()
Print SVFIR.
Definition SVFIR.cpp:632
static void handleBlackHole(bool b)
SVFIR build configurations.
Definition SVFIR.cpp:765
void addToStmt2TypeMap(SVFStmt *edge)
Map a SVFStatement type to a set of corresponding SVF statements.
Definition SVFIR.h:529
CommonCHGraph * chgraph
Definition SVFIR.h:97
SVFStmt * addBlackHoleAddrStmt(NodeID node)
Set a pointer points-to black hole (e.g. int2ptr)
Definition SVFIR.cpp:356
LoadStmt * addLoadStmt(NodeID src, NodeID dst)
Add Load edge.
Definition SVFIR.cpp:263
NodeID addGepValNode(NodeID curInst, const ValVar *base, const AccessPath &ap, NodeID i, const SVFType *type, const ICFGNode *node)
Add a temp field value node, this method can only invoked by getGepValVar.
Definition SVFIR.cpp:471
GepStmt * addNormalGepStmt(NodeID src, NodeID dst, const AccessPath &ap)
Add Offset(Gep) edge.
Definition SVFIR.cpp:423
MemObjToFieldsMap memToFieldsMap
Map a mem object id to all its fields.
Definition SVFIR.h:84
PHINodeMap phiNodeMap
A set of phi copy edges.
Definition SVFIR.h:86
NodeBS getFieldsAfterCollapse(NodeID id)
Definition SVFIR.cpp:579
NodeID addObjNode(NodeID i, ObjTypeInfo *ti, const ICFGNode *node)
Add a memory obj node.
Definition SVFIR.h:650
NodeID getGepObjVar(const BaseObjVar *baseObj, const APOffset &ap)
Get a field SVFIR Object node according to base mem obj and offset.
Definition SVFIR.cpp:508
CallPE * addCallPE(NodeID src, NodeID dst, const CallICFGNode *cs, const FunEntryICFGNode *entry)
Add Call edge.
Definition SVFIR.cpp:310
bool isValidTopLevelPtr(const SVFVar *node)
Definition SVFIR.cpp:748
TDJoinPE * addThreadJoinPE(NodeID src, NodeID dst, const CallICFGNode *cs, const FunExitICFGNode *exit)
Add Thread join edge for parameter passing.
Definition SVFIR.cpp:384
CallGraph * callGraph
all the callsites of a program
Definition SVFIR.h:99
static std::string pagReadFromTxt
Definition SVFIR.h:102
void destroy()
Clean up memory.
Definition SVFIR.cpp:619
const BaseObjVar * getBaseObject(NodeID id) const
Definition SVFIR.h:424
const FunObjVar * getFunObjVar(const std::string &name)
Definition SVFIR.cpp:47
CmpStmt * addCmpStmt(NodeID op1, NodeID op2, NodeID dst, u32_t predict)
Add Copy edge.
Definition SVFIR.cpp:167
AddrStmt * addAddrStmt(NodeID src, NodeID dst)
Add an edge into SVFIR.
Definition SVFIR.cpp:63
UnaryOPStmt * addUnaryOPStmt(NodeID src, NodeID dst, u32_t opcode)
Add Unary edge.
Definition SVFIR.cpp:217
TDForkPE * addThreadForkPE(NodeID src, NodeID dst, const CallICFGNode *cs, const FunEntryICFGNode *entry)
Add Thread fork edge for parameter passing.
Definition SVFIR.cpp:367
BinaryOPStmt * addBinaryOPStmt(NodeID op1, NodeID op2, NodeID dst, u32_t opcode)
Add Copy edge.
Definition SVFIR.cpp:193
NodeBS & getAllFieldsObjVars(const BaseObjVar *obj)
Get all fields of an object.
Definition SVFIR.cpp:558
static std::unique_ptr< SVFIR > pag
Callgraph with direct calls only; no change allowed after init and use callgraph in PointerAnalysis f...
Definition SVFIR.h:101
NodeID addValNode(NodeID i, const SVFType *type, const ICFGNode *icfgNode)
add node into SVFIR
Definition SVFIR.h:591
StoreStmt * addStoreStmt(NodeID src, NodeID dst, const ICFGNode *val)
Add Store edge.
Definition SVFIR.cpp:287
NodeID addGepObjNode(GepObjVar *gepObj, NodeID base, const APOffset &apOffset)
Definition SVFIR.cpp:532
PhiStmt * addPhiStmt(NodeID res, NodeID opnd, const ICFGNode *pred)
Add phi node information.
Definition SVFIR.cpp:108
OrderedNodeSet candidatePointers
Definition SVFIR.h:95
ICFG * icfg
Definition SVFIR.h:96
SVFIR(bool buildFromFile)
Constructor.
Definition SVFIR.cpp:42
SelectStmt * addSelectStmt(NodeID res, NodeID op1, NodeID op2, NodeID cond)
Add SelectStmt.
Definition SVFIR.cpp:141
GepValueVarMap GepValObjMap
Map a pair<base,off> to a gep value node id.
Definition SVFIR.h:81
bool isValidPointer(NodeID nodeId) const
Whether a node is a valid pointer.
Definition SVFIR.cpp:733
BranchStmt * addBranchStmt(NodeID br, NodeID cond, const BranchStmt::SuccAndCondPairVec &succs)
Add BranchStmt.
Definition SVFIR.cpp:240
void initialiseCandidatePointers()
Initialize candidate pointers.
Definition SVFIR.cpp:717
NodeID getFIObjVar(const BaseObjVar *obj) const
Get a field-insensitive obj SVFIR node according to a mem obj.
Definition SVFIR.h:450
NodeID addDummyObjNode(const SVFType *type)
Definition SVFIR.h:496
GenericNode< SVFVar, SVFStmt >::GEdgeSetTy SVFStmtSetTy
NodeID getId() const
Get ID.
Definition SVFValue.h:160
virtual bool isPointer() const
Check if this variable represents a pointer.
bool hasIncomingVariantGepEdge() const
Check for incoming variable field GEP edges.
void set(unsigned Idx)
bool isArgOfUncalledFunction(const SVFVar *svfvar)
Definition SVFUtil.cpp:422
std::ostream & outs()
Overwrite llvm::outs()
Definition SVFUtil.h:52
for isBitcode
Definition BasicTypes.h:68
u32_t NodeID
Definition GeneralType.h:56
s64_t APOffset
Definition GeneralType.h:60
llvm::IRBuilder IRBuilder
Definition BasicTypes.h:74
unsigned u32_t
Definition GeneralType.h:47