예제 #1
0
파일: PAG.cpp 프로젝트: chubbymaggie/SVF
/*!
 * 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";
    }

}
예제 #2
0
/*!
 * 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());
                }
            }
        }
    }

}