36 using namespace SVFUtil;
44 _NumOfConstantPtr = 0;
45 _NumOfBlackholePtr = 0;
46 _MaxPtsSize = _MaxTopLvlPtsSize = 0;
47 _AvgPtsSize = _AvgTopLvlPtsSize = 0;
48 _AvgAddrTakenVarPtsSize = _NumOfAddrTakeVar = 0;
49 _MaxAddrTakenVarPts = 0;
52 for (
int i=IN; i<=OUT; i++)
55 _NumOfSVFGNodesHaveInOut[i] = 0;
56 _NumOfFormalInSVFGNodesHaveInOut[i] = 0;
57 _NumOfFormalOutSVFGNodesHaveInOut[i] = 0;
58 _NumOfActualInSVFGNodesHaveInOut[i] = 0;
59 _NumOfActualOutSVFGNodesHaveInOut[i] = 0;
60 _NumOfLoadSVFGNodesHaveInOut[i] = 0;
61 _NumOfStoreSVFGNodesHaveInOut[i] = 0;
62 _NumOfMSSAPhiSVFGNodesHaveInOut[i] = 0;
65 _NumOfVarHaveINOUTPts[i] = 0;
66 _NumOfVarHaveEmptyINOUTPts[i] = 0;
67 _NumOfVarHaveINOUTPtsInFormalIn[i] = 0;
68 _NumOfVarHaveINOUTPtsInFormalOut[i] = 0;;
69 _NumOfVarHaveINOUTPtsInActualIn[i] = 0;
70 _NumOfVarHaveINOUTPtsInActualOut[i] = 0;
71 _NumOfVarHaveINOUTPtsInLoad[i] = 0;
72 _NumOfVarHaveINOUTPtsInStore[i] = 0;
73 _NumOfVarHaveINOUTPtsInMSSAPhi[i] = 0;
74 _PotentialNumOfVarHaveINOUTPts[i] = 0;
76 _MaxInOutPtsSize[i] = 0;
77 _AvgInOutPtsSize[i] = 0;
86 assert(SVFUtil::isa<FlowSensitive>(fspta) &&
"not an flow-sensitive pta pass!! what else??");
100 statAddrVarPtsSize();
102 u32_t fiObjNumber = 0;
103 u32_t fsObjNumber = 0;
107 NodeID nodeId = nodeIt->first;
108 PAGNode* pagNode = nodeIt->second;
109 if(SVFUtil::isa<ObjVar>(pagNode))
113 if (nodeSet.insert(baseId).second)
123 PTNumStatMap[
"FIObjNum"] = fiObjNumber;
124 PTNumStatMap[
"FSObjNum"] = fsObjNumber;
126 unsigned numOfCopy = 0;
127 unsigned numOfStore = 0;
130 for (; svfgNodeIt != svfgNodeEit; ++svfgNodeIt)
132 SVFGNode* svfgNode = svfgNodeIt->second;
133 if (SVFUtil::isa<CopySVFGNode>(svfgNode))
135 else if (SVFUtil::isa<StoreSVFGNode>(svfgNode))
141 timeStatMap[
"TotalTime"] = (endTime - startTime)/
TIMEINTERVAL;
142 timeStatMap[
"SolveTime"] = fspta->solveTime;
143 timeStatMap[
"SCCTime"] = fspta->sccTime;
144 timeStatMap[
"ProcessTime"] = fspta->processTime;
145 timeStatMap[
"PropagationTime"] = fspta->propagationTime;
146 timeStatMap[
"DirectPropaTime"] = fspta->directPropaTime;
147 timeStatMap[
"IndirectPropaTime"] = fspta->indirectPropaTime;
148 timeStatMap[
"Strong/WeakUpdTime"] = fspta->updateTime;
149 timeStatMap[
"AddrTime"] = fspta->addrTime;
150 timeStatMap[
"CopyTime"] = fspta->copyTime;
151 timeStatMap[
"GepTime"] = fspta->gepTime;
152 timeStatMap[
"LoadTime"] = fspta->loadTime;
153 timeStatMap[
"StoreTime"] = fspta->storeTime;
154 timeStatMap[
"UpdateCGTime"] = fspta->updateCallGraphTime;
155 timeStatMap[
"PhiTime"] = fspta->phiTime;
165 PTNumStatMap[
"CopysNum"] = numOfCopy;
166 PTNumStatMap[
"StoresNum"] = numOfStore;
168 PTNumStatMap[
"SolveIterations"] = fspta->numOfIteration;
170 PTNumStatMap[
"IndEdgeSolved"] = fspta->getNumOfResolvedIndCallEdge();
172 PTNumStatMap[
"NullPointer"] = _NumOfNullPtr;
173 PTNumStatMap[
"PointsToConstPtr"] = _NumOfConstantPtr;
174 PTNumStatMap[
"PointsToBlkPtr"] = _NumOfBlackholePtr;
176 PTNumStatMap[
"StrongUpdates"] = fspta->svfgHasSU.count();
179 PTNumStatMap[
"SNodesHaveIN"] = _NumOfSVFGNodesHaveInOut[IN];
180 PTNumStatMap[
"SNodesHaveOUT"] = _NumOfSVFGNodesHaveInOut[OUT];
182 PTNumStatMap[
"FI_SNodesHaveIN"] = _NumOfFormalInSVFGNodesHaveInOut[IN];
183 PTNumStatMap[
"FI_SNodesHaveOUT"] = _NumOfFormalInSVFGNodesHaveInOut[OUT];
185 PTNumStatMap[
"FO_SNodesHaveIN"] = _NumOfFormalOutSVFGNodesHaveInOut[IN];
186 PTNumStatMap[
"FO_SNodesHaveOUT"] = _NumOfFormalOutSVFGNodesHaveInOut[OUT];
188 PTNumStatMap[
"AI_SNodesHaveIN"] = _NumOfActualInSVFGNodesHaveInOut[IN];
189 PTNumStatMap[
"AI_SNodesHaveOUT"] = _NumOfActualInSVFGNodesHaveInOut[OUT];
191 PTNumStatMap[
"AO_SNodesHaveIN"] = _NumOfActualOutSVFGNodesHaveInOut[IN];
192 PTNumStatMap[
"AO_SNodesHaveOUT"] = _NumOfActualOutSVFGNodesHaveInOut[OUT];
194 PTNumStatMap[
"LD_SNodesHaveIN"] = _NumOfLoadSVFGNodesHaveInOut[IN];
195 PTNumStatMap[
"LD_SNodesHaveOUT"] = _NumOfLoadSVFGNodesHaveInOut[OUT];
197 PTNumStatMap[
"ST_SNodesHaveIN"] = _NumOfStoreSVFGNodesHaveInOut[IN];
198 PTNumStatMap[
"ST_SNodesHaveOUT"] = _NumOfStoreSVFGNodesHaveInOut[OUT];
200 PTNumStatMap[
"PHI_SNodesHaveIN"] = _NumOfMSSAPhiSVFGNodesHaveInOut[IN];
201 PTNumStatMap[
"PHI_SNodesHaveOUT"] = _NumOfMSSAPhiSVFGNodesHaveInOut[OUT];
205 PTNumStatMap[
"VarHaveIN"] = _NumOfVarHaveINOUTPts[IN];
206 PTNumStatMap[
"VarHaveOUT"] = _NumOfVarHaveINOUTPts[OUT];
208 PTNumStatMap[
"PotentialVarHaveIN"] = _PotentialNumOfVarHaveINOUTPts[IN];
209 PTNumStatMap[
"PotentialVarHaveOUT"] = _PotentialNumOfVarHaveINOUTPts[OUT];
211 PTNumStatMap[
"VarHaveEmptyIN"] = _NumOfVarHaveEmptyINOUTPts[IN];
212 PTNumStatMap[
"VarHaveEmptyOUT"] = _NumOfVarHaveEmptyINOUTPts[OUT];
214 PTNumStatMap[
"VarHaveIN_FI"] = _NumOfVarHaveINOUTPtsInFormalIn[IN];
215 PTNumStatMap[
"VarHaveOUT_FI"] = _NumOfVarHaveINOUTPtsInFormalIn[OUT];
217 PTNumStatMap[
"VarHaveIN_FO"] = _NumOfVarHaveINOUTPtsInFormalOut[IN];
218 PTNumStatMap[
"VarHaveOUT_FO"] = _NumOfVarHaveINOUTPtsInFormalOut[OUT];
220 PTNumStatMap[
"VarHaveIN_AI"] = _NumOfVarHaveINOUTPtsInActualIn[IN];
221 PTNumStatMap[
"VarHaveOUT_AI"] = _NumOfVarHaveINOUTPtsInActualIn[OUT];
223 PTNumStatMap[
"VarHaveIN_AO"] = _NumOfVarHaveINOUTPtsInActualOut[IN];
224 PTNumStatMap[
"VarHaveOUT_AO"] = _NumOfVarHaveINOUTPtsInActualOut[OUT];
226 PTNumStatMap[
"VarHaveIN_LD"] = _NumOfVarHaveINOUTPtsInLoad[IN];
227 PTNumStatMap[
"VarHaveOUT_LD"] = _NumOfVarHaveINOUTPtsInLoad[OUT];
229 PTNumStatMap[
"VarHaveIN_ST"] = _NumOfVarHaveINOUTPtsInStore[IN];
230 PTNumStatMap[
"VarHaveOUT_ST"] = _NumOfVarHaveINOUTPtsInStore[OUT];
232 PTNumStatMap[
"VarHaveIN_PHI"] = _NumOfVarHaveINOUTPtsInMSSAPhi[IN];
233 PTNumStatMap[
"VarHaveOUT_PHI"] = _NumOfVarHaveINOUTPtsInMSSAPhi[OUT];
235 PTNumStatMap[
"MaxPtsSize"] = _MaxPtsSize;
236 PTNumStatMap[
"MaxTopLvlPtsSize"] = _MaxTopLvlPtsSize;
237 PTNumStatMap[
"MaxINPtsSize"] = _MaxInOutPtsSize[IN];
238 PTNumStatMap[
"MaxOUTPtsSize"] = _MaxInOutPtsSize[OUT];
240 timeStatMap[
"AvgPtsSize"] = _AvgPtsSize;
241 timeStatMap[
"AvgTopLvlPtsSize"] = _AvgTopLvlPtsSize;
243 PTNumStatMap[
"NumOfAddrTakenVar"] = _NumOfAddrTakeVar;
244 timeStatMap[
"AvgAddrTakenVarPts"] = (_NumOfAddrTakeVar == 0) ?
245 0 : ((
double)_AvgAddrTakenVarPtsSize / _NumOfAddrTakeVar);
246 PTNumStatMap[
"MaxAddrTakenVarPts"] = _MaxAddrTakenVarPts;
248 timeStatMap[
"AvgINPtsSize"] = _AvgInOutPtsSize[IN];
249 timeStatMap[
"AvgOUTPtsSize"] = _AvgInOutPtsSize[OUT];
251 PTNumStatMap[
"ProcessedAddr"] = fspta->numOfProcessedAddr;
252 PTNumStatMap[
"ProcessedCopy"] = fspta->numOfProcessedCopy;
253 PTNumStatMap[
"ProcessedGep"] = fspta->numOfProcessedGep;
254 PTNumStatMap[
"ProcessedLoad"] = fspta->numOfProcessedLoad;
255 PTNumStatMap[
"ProcessedStore"] = fspta->numOfProcessedStore;
256 PTNumStatMap[
"ProcessedPhi"] = fspta->numOfProcessedPhi;
257 PTNumStatMap[
"ProcessedAParam"] = fspta->numOfProcessedActualParam;
258 PTNumStatMap[
"ProcessedFRet"] = fspta->numOfProcessedFormalRet;
259 PTNumStatMap[
"ProcessedMSSANode"] = fspta->numOfProcessedMSSANode;
261 PTNumStatMap[
"NumOfNodesInSCC"] = fspta->numOfNodesInSCC;
262 PTNumStatMap[
"MaxSCCSize"] = fspta->maxSCCSize;
263 PTNumStatMap[
"NumOfSCC"] = fspta->numOfSCC;
264 timeStatMap[
"AverageSCCSize"] = (fspta->numOfSCC == 0) ? 0 :
265 ((
double)fspta->numOfNodesInSCC / fspta->numOfSCC);
273 for (
SVFIR::iterator iter = fspta->getPAG()->begin(), eiter = fspta->getPAG()->end();
274 iter != eiter; ++iter)
276 NodeID pagNodeId = iter->first;
277 PAGNode* pagNode = iter->second;
280 if (inComingStore.empty()==
false || outGoingLoad.empty()==
false)
283 const PointsTo& pts = fspta->getPts(pagNodeId);
284 if(fspta->containBlackHoleNode(pts))
288 if(fspta->containConstantNode(pts))
290 _NumOfBlackholePtr++;
295 std::stringstream rawstr(str);
296 if (!SVFUtil::isa<DummyValVar>(pagNode) && !SVFUtil::isa<DummyObjVar>(pagNode))
302 rawstr <<
"##Null Pointer : (NodeID " << pagNode->
getId()
310 rawstr <<
"##Null Pointer : (NodeID " << pagNode->
getId();
324 if (SVFUtil::isa<FlowSensitive::MutDFPTDataTy>(fspta->getPTDataTy()))
327 statInOutPtsSize(fspta->getDFInputMap(), IN);
329 statInOutPtsSize(fspta->getDFOutputMap(), OUT);
333 u32_t totalValidTopLvlPointers = 0;
334 u32_t topTopLvlPtsSize = 0;
335 for (
SVFIR::iterator iter = fspta->getPAG()->begin(), eiter = fspta->getPAG()->end();
336 iter != eiter; ++iter)
338 NodeID node = iter->first;
339 if (fspta->getPAG()->isValidTopLevelPtr(iter->second) ==
false)
341 u32_t size = fspta->getPts(node).count();
343 totalValidTopLvlPointers++;
344 topTopLvlPtsSize+=size;
346 if(size > _MaxPtsSize) _MaxPtsSize = size;
348 if (size > _MaxTopLvlPtsSize) _MaxTopLvlPtsSize = size;
351 if (totalValidTopLvlPointers != 0)
352 _AvgTopLvlPtsSize = (double)topTopLvlPtsSize/totalValidTopLvlPointers;
354 _TotalPtsSize += topTopLvlPtsSize;
355 u32_t totalPointer = totalValidTopLvlPointers + _NumOfVarHaveINOUTPts[IN] + _NumOfVarHaveINOUTPts[OUT];
356 if (totalPointer != 0)
357 _AvgPtsSize = (double) _TotalPtsSize / totalPointer;
363 _NumOfSVFGNodesHaveInOut[inOrOut] = data.size();
365 u32_t inOutPtsSize = 0;
366 DFInOutMap::const_iterator it = data.begin();
367 DFInOutMap::const_iterator eit = data.end();
368 for (; it != eit; ++it)
370 const SVFGNode* node = fspta->svfg->getSVFGNode(it->first);
373 if (SVFUtil::isa<FormalINSVFGNode>(node))
374 _NumOfFormalInSVFGNodesHaveInOut[inOrOut]++;
375 else if (SVFUtil::isa<FormalOUTSVFGNode>(node))
376 _NumOfFormalOutSVFGNodesHaveInOut[inOrOut]++;
377 else if (SVFUtil::isa<ActualINSVFGNode>(node))
378 _NumOfActualInSVFGNodesHaveInOut[inOrOut]++;
379 else if (SVFUtil::isa<ActualOUTSVFGNode>(node))
380 _NumOfActualOutSVFGNodesHaveInOut[inOrOut]++;
381 else if (SVFUtil::isa<LoadSVFGNode>(node))
382 _NumOfLoadSVFGNodesHaveInOut[inOrOut]++;
383 else if (SVFUtil::isa<StoreSVFGNode>(node))
384 _NumOfStoreSVFGNodesHaveInOut[inOrOut]++;
385 else if (SVFUtil::isa<MSSAPHISVFGNode>(node))
386 _NumOfMSSAPhiSVFGNodesHaveInOut[inOrOut]++;
388 assert(
false &&
"unexpected node have IN/OUT set");
393 const PtsMap& cptsMap = it->second;
394 PtsMap::const_iterator ptsIt = cptsMap.begin();
395 PtsMap::const_iterator ptsEit = cptsMap.end();
396 for (; ptsIt != ptsEit; ++ptsIt)
398 if (ptsIt->second.empty())
400 _NumOfVarHaveEmptyINOUTPts[inOrOut]++;
404 u32_t ptsNum = ptsIt->second.count();
407 _NumOfVarHaveINOUTPts[inOrOut]++;
409 if (SVFUtil::isa<FormalINSVFGNode>(node))
410 _NumOfVarHaveINOUTPtsInFormalIn[inOrOut]++;
411 else if (SVFUtil::isa<FormalOUTSVFGNode>(node))
412 _NumOfVarHaveINOUTPtsInFormalOut[inOrOut]++;
413 else if (SVFUtil::isa<ActualINSVFGNode>(node))
414 _NumOfVarHaveINOUTPtsInActualIn[inOrOut]++;
415 else if (SVFUtil::isa<ActualOUTSVFGNode>(node))
416 _NumOfVarHaveINOUTPtsInActualOut[inOrOut]++;
417 else if (SVFUtil::isa<LoadSVFGNode>(node))
418 _NumOfVarHaveINOUTPtsInLoad[inOrOut]++;
419 else if (SVFUtil::isa<StoreSVFGNode>(node))
420 _NumOfVarHaveINOUTPtsInStore[inOrOut]++;
421 else if (SVFUtil::isa<MSSAPHISVFGNode>(node))
422 _NumOfVarHaveINOUTPtsInMSSAPhi[inOrOut]++;
424 assert(
false &&
"unexpected node have IN/OUT set");
426 inOutPtsSize += ptsNum;
428 if (ptsNum > _MaxInOutPtsSize[inOrOut])
429 _MaxInOutPtsSize[inOrOut] = ptsNum;
431 if (ptsNum > _MaxPtsSize) _MaxPtsSize = ptsNum;
435 if (_NumOfVarHaveINOUTPts[inOrOut] != 0)
436 _AvgInOutPtsSize[inOrOut] = (double)inOutPtsSize / _NumOfVarHaveINOUTPts[inOrOut];
438 _TotalPtsSize += inOutPtsSize;
444 const SVFG *svfg = fspta->svfg;
458 _PotentialNumOfVarHaveINOUTPts[IN] += incomingObjects.
count();
460 if (
const StoreSVFGNode *store = SVFUtil::dyn_cast<StoreSVFGNode>(sn))
462 NodeID p = store->getPAGDstNodeID();
465 for (
NodeID o : fspta->ander->getPts(
p)) incomingObjects.
set(o);
467 _PotentialNumOfVarHaveINOUTPts[OUT] += incomingObjects.
count();
477 SVFG::SVFGNodeIDToNodeMapTy::const_iterator it = fspta->svfg->begin();
478 SVFG::SVFGNodeIDToNodeMapTy::const_iterator eit = fspta->svfg->end();
479 for (; it != eit; ++it)
482 if (
const StoreSVFGNode* store = SVFUtil::dyn_cast<StoreSVFGNode>(node))
484 calculateAddrVarPts(store->getPAGDstNodeID(), store);
494 const PointsTo& pts = fspta->getPts(pointer);
495 _NumOfAddrTakeVar += pts.
count();
498 for (; ptsIt != ptsEit; ++ptsIt)
500 const NodeID ptd = *ptsIt;
502 const PointsTo& cpts = fspta->getDFOutPtsSet(svfg_node, ptd);
503 _AvgAddrTakenVarPtsSize += cpts.
count();
504 if (cpts.
count() > _MaxAddrTakenVarPts)
505 _MaxAddrTakenVarPts = cpts.
count();
void calculateAddrVarPts(NodeID pointer, const SVFGNode *node)
virtual void performStat()
FlowSensitive::PtsMap PtsMap
FlowSensitive::DFInOutMap DFInOutMap
void statAddrVarPtsSize()
void statInOutPtsSize(const DFInOutMap &data, ENUM_INOUT inOrOut)
iterator begin()
Iterators.
IDToNodeMapTy::const_iterator const_iterator
IDToNodeMapTy::iterator iterator
Node Iterators.
const GEdgeSetTy & getInEdges() const
u32_t getValueNodeNum() const
u32_t getObjectNodeNum() const
const NodeBS & getPointsTo() const
SymID getId() const
Get the memory object id.
bool isFieldInsensitive() const
Return true if its field limit is 0.
void performStat() override
bool empty() const
Returns true if set is empty.
const_iterator end() const
u32_t count() const
Returns number of elements.
const_iterator begin() const
NodeID getId() const
Get ID.
static SVFIR * getPAG(bool buildFromFile=false)
Singleton design here to make sure we only have one instance during any analysis.
u32_t getFieldObjNodeNum() const
u32_t getFieldValNodeNum() const
Node and edge statistics.
const MemObj * getBaseObj(NodeID id) const
virtual void printStat(std::string str="")
GenericNode< SVFVar, SVFStmt >::GEdgeSetTy SVFStmtSetTy
const std::string & getName() const
bool ptrInUncalledFunction() const
SVFStmt::SVFStmtSetTy & getIncomingEdges(SVFStmt::PEDGEK kind)
Get incoming SVFIR statements (edges)
SVFStmt::SVFStmtSetTy & getOutgoingEdges(SVFStmt::PEDGEK kind)
Get outgoing SVFIR statements (edges)
const SVFValue * getValue() const
Get/has methods of the components.
void writeWrnMsg(const std::string &msg)
Writes a message run through wrnMsg.
std::unordered_set< Key, Hash, KeyEqual, Allocator > Set