示例#1
0
        /// <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);
                    }
                }
            }
        }