/// <summary> /// Prunes the graph. /// </summary> void PruneGraph() { List <Node> remove = new List <Node>(); foreach (Node u in this.CGraph.Vertices) { if (u.GetType().ToString().Contains("CActBegin")) { CActBegin m = (CActBegin)u; if (m.Addresses.Count == 0) { remove.Add(u); continue; } bool found = false; foreach (Node v in this.CGraph.Vertices) { if (v.GetType().ToString().Contains("CActBegin")) { CActBegin n = (CActBegin)v; if (m.Equals(n) || m.MachineId == n.MachineId) { continue; } foreach (MemAccess ma in m.Addresses) { var list = n.Addresses.Where(item => item.ObjHandle == ma.ObjHandle && item.Offset == ma.Offset); if (list.Count() > 0) { found = true; break; } } } if (found == true) { break; } } if (found == false) { remove.Add(u); } } } foreach (Node u in remove) { if (this.CGraph.InDegree(u) == 0 || this.CGraph.OutDegree(u) == 0) { this.CGraph.RemoveVertex(u); } else { IEnumerable <Edge> fromEdges = this.CGraph.InEdges(u); IEnumerable <Edge> toEdges = this.CGraph.OutEdges(u); foreach (Edge fromEdge in fromEdges) { Node from = fromEdge.Source; foreach (Edge toEdge in toEdges) { Node to = toEdge.Target; this.CGraph.AddEdge(new Edge(from, to)); } this.CGraph.RemoveVertex(u); } } } }