Esempio n. 1
0
void CFAnalyzer::intraInterFlow(Flow& flow, InterFlow& interFlow) {
  for(InterFlow::iterator i=interFlow.begin();i!=interFlow.end();++i) {
	if((*i).entry==Labeler::NO_LABEL && (*i).exit==Labeler::NO_LABEL) {
	  Edge externalEdge=Edge((*i).call,EDGE_EXTERNAL,(*i).callReturn);	  
	  flow.insert(externalEdge);
	} else {
	  Edge callEdge=Edge((*i).call,EDGE_CALL,(*i).entry);
	  Edge callReturnEdge=Edge((*i).exit,EDGE_CALLRETURN,(*i).callReturn);
	  Edge localEdge=Edge((*i).call,EDGE_LOCAL,(*i).callReturn);
	  flow.insert(callEdge);
	  flow.insert(callReturnEdge);
	  flow.insert(localEdge);
	}
  }
}
Esempio n. 2
0
InterFlow CFAnalysis::interFlow(Flow& flow) {
  // 1) for each call use AST information to find its corresponding called function
  // 2) create a set of <call,entry,exit,callreturn> edges
  cout<<"STATUS: establishing inter-flow ..."<<endl;
  InterFlow interFlow;
  LabelSet callLabs=functionCallLabels(flow);
  int callLabsNum=callLabs.size();
  cout << "INFO: number of function call labels: "<<callLabsNum<<endl;
  int callLabNr=0;
  for(LabelSet::iterator i=callLabs.begin();i!=callLabs.end();++i) {
    //cout<<"INFO: resolving function call "<<callLabNr<<" of "<<callLabsNum<<endl;
    SgNode* callNode=getNode(*i);
    //cout<<"INFO: creating inter-flow for "<<callNode->unparseToString();
    //info: callNode->get_args()
    SgFunctionCallExp *funCall=SgNodeHelper::Pattern::matchFunctionCall(callNode);
    if(!funCall) 
      throw SPRAY::Exception("interFlow: unknown call exp (not a SgFunctionCallExp)");
    SgFunctionDefinition* funDef=SgNodeHelper::determineFunctionDefinition(funCall);
    Label callLabel,entryLabel,exitLabel,callReturnLabel;
    if(funDef==0) {
      //cout<<" [no definition found]"<<endl;
      // we were not able to find the funDef in the AST
      //cout << "STATUS: External function ";
      //if(SgFunctionDeclaration* funDecl=funCall->getAssociatedFunctionDeclaration())
      //  cout << SgNodeHelper::getFunctionName(funDecl)<<"."<<endl;
      //else
      //  cout << "cannot be determined."<<endl;
      callLabel=*i;
      entryLabel=Labeler::NO_LABEL;
      exitLabel=Labeler::NO_LABEL;
      callReturnLabel=labeler->functionCallReturnLabel(callNode);
      //cout <<"No function definition found for call: "<<funCall->unparseToString()<<endl;
    } else {
      //cout<<" [definition found]"<<endl;
      callLabel=*i;
      entryLabel=labeler->functionEntryLabel(funDef);
      exitLabel=labeler->functionExitLabel(funDef);
      callReturnLabel=labeler->functionCallReturnLabel(callNode);
    }
    interFlow.insert(InterEdge(callLabel,entryLabel,exitLabel,callReturnLabel));
    callLabNr++;
  }
  cout<<"STATUS: inter-flow established."<<endl;
  return interFlow;
}
Esempio n. 3
0
InterFlow CFAnalyzer::interFlow(Flow& flow) {
  // 1) for each call use AST information to find its corresponding called function
  // 2) create a set of <call,entry,exit,callreturn> edges
  InterFlow interFlow;
  LabelSet callLabs=functionCallLabels(flow);
  //cout << "calllabs: "<<callLabs.size()<<endl;
  for(LabelSet::iterator i=callLabs.begin();i!=callLabs.end();++i) {
	SgNode* callNode=getNode(*i);
	//info: callNode->get_args()
	SgFunctionCallExp *funCall=SgNodeHelper::Pattern::matchFunctionCall(callNode);
	if(!funCall) 
	  throw "Error: interFlow: unkown call exp (not a SgFunctionCallExp).";
	SgFunctionDefinition* funDef=SgNodeHelper::determineFunctionDefinition(funCall);
	Label callLabel,entryLabel,exitLabel,callReturnLabel;
	if(funDef==0) {
	  // we were not able to find the funDef in the AST
	  cout << "STATUS: External function ";
	  if(SgFunctionDeclaration* funDecl=funCall->getAssociatedFunctionDeclaration())
		cout << SgNodeHelper::getFunctionName(funDecl)<<"."<<endl;
	  else
		cout << "cannot be determined."<<endl;
	  callLabel=*i;
	  entryLabel=Labeler::NO_LABEL;
	  exitLabel=Labeler::NO_LABEL;
	  callReturnLabel=labeler->functionCallReturnLabel(callNode);
	} else {
	  callLabel=*i;
	  entryLabel=labeler->functionEntryLabel(funDef);
	  exitLabel=labeler->functionExitLabel(funDef);
	  callReturnLabel=labeler->functionCallReturnLabel(callNode);
	}
	interFlow.insert(InterEdge(callLabel,entryLabel,exitLabel,callReturnLabel));
	  
  }
  return interFlow;
}