CFG::CFG(func_t *func) { eavec_t eavec; eavec.push_back(func->startEA); while(!eavec.empty()) { ea_t *front = eavec.front(); ea_t working_ea = *front; eavec.erase(front); if(!Split(ea)) { BasicBlock block; block.boundary.ea1 = block.boundary.ea2 = ea; bool bContinue = 1; do { flags_t flags = get_flags(ea); if(!isFlow(flags) && block.boundary.ea1 == ea) break; if(!isCode(flags)) break; if(Split(ea)) { Edge edge; edge.ea = ea; edge.type = 3; block.inedges.push_back(edge); break; } if(GetIncoming(ea, &eavec, &block)) bContinue = 0; ea = get_item_end(ea); } while(!bContinue); } // end if(!Split(ea)) m_Vector.push_back(block); } // end while(!eavec.empty()) m_NumBlocks = m_Vector.size(); for(int i = 0; i < m_NumBlocks; ++i) { for(int j = 0; j <= m_Vector[i].inedges.size(); ++j) { Edge e; e.ea = m_Vector[i].boundary.ea1; e.type = m_Vector[i].inedges[j].type; int idx = -1; for(int k = 0; k < m_NumBlocks; ++k) { if(m_Vector[k].boundary.ea1 == m_Vector[i].inedges[j].ea) { idx = k; break; } } // bug here, if idx = -1 m_Vector[idx].outedges.push_back(e); } } }