Ejemplo n.º 1
0
        public void RemoveFrameworkEntryPoints(HashSet <string> frameworkAssemblies)
        {
            var removing = new List <ICallGraphNode>(EntryNodes.Count);

            foreach (var entryNode in EntryNodes.Values)
            {
                if (!frameworkAssemblies.Contains(entryNode.AssemblyName))
                {
                    continue;
                }

                RemoveUnavailableNodesFrom(entryNode);
                removing.Add(entryNode);
            }

            foreach (var entryNode in removing)
            {
                EntryNodes.Remove(entryNode.MethodSignature);
            }
        }
Ejemplo n.º 2
0
        private void RemoveUnavailableNodesTo(ICallGraphNode node)
        {
            Debug.Assert(node.OutNodes.Count == 0);

            Nodes.Remove(node.MethodSignature);
            if (node.InNodes.Count == 0)
            {
                EntryNodes.Remove(node.MethodSignature);
            }

            for (var i = 0; i < node.InNodes.Count; i++)
            {
                var inNode = node.InNodes[i];
                inNode.OutNodes.Remove(node);
                if (inNode.OutNodes.Count == 0)
                {
                    RemoveUnavailableNodesTo(inNode);
                }
            }
        }
Ejemplo n.º 3
0
        public void RemoveNonPublicEntryNodes()
        {
            var processingNodes = new Queue <ICallGraphNode>(EntryNodes.Values);

            while (processingNodes.Count > 0)
            {
                var node = processingNodes.Dequeue();
                if (node.IsPublic)
                {
                    continue;
                }

                foreach (var outNode in node.OutNodes)
                {
                    if (outNode == node)
                    {
                        continue;
                    }

                    outNode.InNodes.Remove(node);
                    if ((outNode.InNodes.Count == 0) ||
                        (outNode.InNodes.Count == 1 && outNode.Equals(outNode.InNodes[0])))    // simple recursive calls
                    {
                        // TODO: Add detection of recursive calls like A() -> B() -> A()
                        if (outNode.IsPublic)
                        {
                            EntryNodes.Add(outNode.MethodSignature, outNode);
                        }
                        else
                        {
                            processingNodes.Enqueue(outNode);
                        }
                    }
                }

                EntryNodes.Remove(node.MethodSignature);
                Nodes.Remove(node.MethodSignature);
            }
        }