/*! * Print this PAG graph including its nodes and edges */ void PAG::print() { for (iterator I = begin(), E = end(); I != E; ++I) { PAGNode* node = I->second; if (!isa<DummyValPN>(node) && !isa<DummyObjPN>(node)) { outs() << "node " << node->getId() << " " << *(node->getValue()) << "\n"; outs() << "\t InEdge: { "; for (PAGNode::iterator iter = node->getInEdges().begin(); iter != node->getInEdges().end(); ++iter) { outs() << (*iter)->getSrcID() << " "; if (NormalGepPE* edge = dyn_cast<NormalGepPE>(*iter)) outs() << " offset=" << edge->getOffset() << " "; else if (isa<VariantGepPE>(*iter)) outs() << " offset=variant"; } outs() << "}\t"; outs() << "\t OutEdge: { "; for (PAGNode::iterator iter = node->getOutEdges().begin(); iter != node->getOutEdges().end(); ++iter) { outs() << (*iter)->getDstID() << " "; if (NormalGepPE* edge = dyn_cast<NormalGepPE>(*iter)) outs() << " offset=" << edge->getOffset() << " "; else if (isa<VariantGepPE>(*iter)) outs() << " offset=variant"; } outs() << "}\n"; } outs() << "\n"; } }
/*! * Stat null pointers */ void AndersenStat::statNullPtr() { _NumOfNullPtr = 0; for (PAG::iterator iter = pta->getPAG()->begin(), eiter = pta->getPAG()->end(); iter != eiter; ++iter) { NodeID pagNodeId = iter->first; PAGNode* pagNode = iter->second; PAGEdge::PAGEdgeSetTy& inComingStore = pagNode->getIncomingEdges(PAGEdge::Store); PAGEdge::PAGEdgeSetTy& outGoingLoad = pagNode->getOutgoingEdges(PAGEdge::Load); if (inComingStore.empty()==false || outGoingLoad.empty()==false) { ///TODO: change the condition here to fetch the points-to set PointsTo& pts = pta->getPts(pagNodeId); if(pta->containBlackHoleNode(pts)) { _NumOfConstantPtr++; } if(pta->containConstantNode(pts)) { _NumOfBlackholePtr++; } if(pts.empty()) { std::string str; raw_string_ostream rawstr(str); if (!isa<DummyValPN>(pagNode) && !isa<DummyObjPN>(pagNode) ) { // if a pointer is in dead function, we do not care if(isPtrInDeadFunction(pagNode->getValue()) == false) { _NumOfNullPtr++; rawstr << "##Null Pointer : (NodeID " << pagNode->getId() << ") PtrName:" << pagNode->getValue()->getName(); wrnMsg(rawstr.str()); //pagNode->getValue()->dump(); } } else { _NumOfNullPtr++; rawstr << "##Null Pointer : (NodeID " << pagNode->getId(); wrnMsg(rawstr.str()); } } } } }