示例#1
0
            public AlternativeDependencyAnalyzer(CFGNode cfgNode, PointsToGraph ptg, AlternativeDependencyAnalysis depAnalysis)
            {
                this.cfgNode = cfgNode;
                this.ptg     = ptg;

                this.depAnalysis = depAnalysis;
            }
示例#2
0
        public static IEnumerable <PTGNode> GetReachableNodes(this PointsToGraph ptg)
        {
            var result = ptg.Variables.SelectMany(v => ptg.GetReachableNodes(v))
                         .Distinct();

            return(result);
        }
示例#3
0
        public static bool MayAlias(this PointsToGraph ptg, InstanceFieldAccess access1, InstanceFieldAccess access2)
        {
            var targets1 = ptg.GetTargets(access1);
            var targets2 = ptg.GetTargets(access2);
            var alias    = targets1.Intersect(targets2);

            return(alias.Any());
        }
示例#4
0
        public static bool MayAlias(this PointsToGraph ptg, InstanceFieldAccess access, IVariable variable)
        {
            var targetsAccess   = ptg.GetTargets(access);
            var targetsVariable = ptg.GetTargets(variable);
            var alias           = targetsAccess.Intersect(targetsVariable);

            return(alias.Any());
        }
示例#5
0
        public static bool MayAlias(this PointsToGraph ptg, IVariable variable1, IVariable variable2)
        {
            var targets1 = ptg.GetTargets(variable1);
            var targets2 = ptg.GetTargets(variable2);
            var alias    = targets1.Intersect(targets2);

            return(alias.Any());
        }
示例#6
0
        public static void RemoveTemporalVariables(this PointsToGraph ptg)
        {
            var temporals = ptg.Variables.OfType <TemporalVariable>().ToArray();

            foreach (var temporal in temporals)
            {
                ptg.Remove(temporal);
            }
        }
示例#7
0
 public static void RemoveTemporalVariables(this PointsToGraph ptg)
 {
     foreach (var variable in ptg.Variables)
     {
         if (variable.IsTemporal())
         {
             ptg.Remove(variable);
         }
     }
 }
示例#8
0
        public static ISet <IVariable> GetAliases(this PointsToGraph ptg, IVariable variable)
        {
            var result = new HashSet <IVariable>()
            {
                variable
            };

            foreach (var ptgNode in ptg.GetTargets(variable))
            {
                if (!ptgNode.Equals(ptg.Null))
                {
                    result.UnionWith(ptgNode.Variables);
                }
            }

            return(result);
        }
示例#9
0
        public static bool IsReachable(this PointsToGraph ptg, IVariable variable, PTGNode target)
        {
            var result       = false;
            var visitedNodes = new HashSet <PTGNode>();
            var worklist     = new Queue <PTGNode>();
            var nodes        = ptg.GetTargets(variable);

            foreach (var node in nodes)
            {
                worklist.Enqueue(node);
                visitedNodes.Add(node);
            }

            while (worklist.Any())
            {
                var node = worklist.Dequeue();

                if (node.Equals(ptg.Null))
                {
                    continue;
                }

                if (node.Equals(target))
                {
                    result = true;
                    break;
                }

                foreach (var targets in node.Targets.Values)
                {
                    foreach (var nodeTarget in targets)
                    {
                        if (!visitedNodes.Contains(nodeTarget))
                        {
                            worklist.Enqueue(nodeTarget);
                            visitedNodes.Add(nodeTarget);
                        }
                    }
                }
            }

            return(result);
        }
示例#10
0
        public static IEnumerable <PTGNode> GetReachableNodes(this PointsToGraph ptg, IVariable variable)
        {
            var visitedNodes = new HashSet <PTGNode>();
            var worklist     = new Queue <PTGNode>();
            var nodes        = ptg.GetTargets(variable);

            foreach (var node in nodes)
            {
                worklist.Enqueue(node);
                visitedNodes.Add(node);
            }

            while (worklist.Any())
            {
                var node = worklist.Dequeue();

                yield return(node);

                if (node.Equals(ptg.Null))
                {
                    continue;
                }

                foreach (var targets in node.Targets.Values)
                {
                    foreach (var nodeTarget in targets)
                    {
                        if (!visitedNodes.Contains(nodeTarget))
                        {
                            worklist.Enqueue(nodeTarget);
                            visitedNodes.Add(nodeTarget);
                        }
                    }
                }
            }
        }
示例#11
0
        public Set <VariableEffect> ComputePathsFromVariableToHeapLocation(Set <IPTAnalysisNode> ns, Label lb)
        {
            Set <VariableEffect> variableEffects = new Set <VariableEffect>();

            //if (WriteEffects.HasWriteEffects)
            //    Console.Out.WriteLine("Modifies:");

            // Traverse every write effect
            foreach (IPTAnalysisNode n in ns)
            {
                // Get the fields that are backward reachable from the modified field
                Set <List <Edge> > paths = PointsToGraph.DFSPathFrom(n, false, true, true);
                foreach (List <Edge> currentPath in paths)
                {
                    currentPath.Reverse();

                    IPTAnalysisNode rootNode;

                    if (currentPath.Count > 0)
                    {
                        rootNode = currentPath[0].Src;
                    }
                    else
                    {
                        rootNode = n;
                    }

                    Variable v = null;

                    if (rootNode.IsVariableReference)
                    {
                        IVarRefNode vrNode = rootNode as IVarRefNode;
                        v = vrNode.ReferencedVariable;
                        if (!IsLocal(v))
                        {
                            continue;
                        }
                        //if (!(v is Parameter) && !v.Equals(PTGraph.GlobalScope))
                        //    continue;
                    }

                    if (rootNode.Equals(GNode.nGBL))
                    {
                        v = PTGraph.GlobalScope;
                    }

                    /*
                     * if (rootNode.IsParameterNode && ((PNode)rootNode).IsByValue)
                     * {
                     *  bool fieldUpdate = !n.Field.Equals(PTGraph.asterisk);
                     *  foreach (Edge e in currentPath)
                     *      fieldUpdate = fieldUpdate || !e.Field.Equals(PTGraph.asterisk);
                     *  if (!fieldUpdate)
                     *      continue;
                     * }
                     */
                    string nodeName = rootNode.Name;

                    if (v != null)
                    {
                        VariableEffect vEffect = new VariableEffect(v, lb);
                        foreach (Edge e in currentPath)
                        {
                            if (!e.Field.Equals(PTGraph.asterisk))
                            {
                                vEffect.AddField(e.Field);
                                // lastField = e.Field;
                            }
                        }
                        variableEffects.Add(vEffect);
                    }
                }
            }
            return(variableEffects);
        }
示例#12
0
        private void LastDefSet(IVariable variable, IFieldReference field, int location, PointsToGraph ptg)
        {
            var query = ptg.GetTargets(variable);

            foreach (var ptgNode in query)
            {
                LastDefSet(ptgNode, field, location);
            }
        }
示例#13
0
        private ICollection <int> LastDefGet(IVariable variable, IFieldReference field, PointsToGraph ptg)
        {
            var query  = ptg.GetTargets(variable).SelectMany(ptgNode => LastDefGet(ptgNode, field));
            var result = new HashSet <int>();

            result.AddRange(query);
            return(result);
        }
示例#14
0
        public static string Serialize(PointsToGraph ptg)
        {
            using (var stringWriter = new StringWriter())
                using (var xmlWriter = new XmlTextWriter(stringWriter))
                {
                    xmlWriter.Formatting = Formatting.Indented;
                    xmlWriter.WriteStartElement("DirectedGraph");
                    xmlWriter.WriteAttributeString("xmlns", "http://schemas.microsoft.com/vs/2009/dgml");
                    xmlWriter.WriteStartElement("Nodes");

                    foreach (var variable in ptg.Variables)
                    {
                        var label = variable.Name;

                        xmlWriter.WriteStartElement("Node");
                        xmlWriter.WriteAttributeString("Id", label);
                        xmlWriter.WriteAttributeString("Label", label);
                        xmlWriter.WriteAttributeString("Shape", "None");
                        xmlWriter.WriteEndElement();
                    }

                    foreach (var node in ptg.Nodes)
                    {
                        var nodeId = Convert.ToString(node.Id);
                        var label  = DGMLSerializer.Serialize(node);

                        xmlWriter.WriteStartElement("Node");
                        xmlWriter.WriteAttributeString("Id", nodeId);
                        xmlWriter.WriteAttributeString("Label", label);

                        if (node.Kind == PTGNodeKind.Null)
                        {
                            xmlWriter.WriteAttributeString("Background", "Yellow");
                        }
                        else if (node.Kind == PTGNodeKind.Unknown)
                        {
                            xmlWriter.WriteAttributeString("Background", "#FFB445");
                            xmlWriter.WriteAttributeString("StrokeDashArray", "6,6");
                        }

                        xmlWriter.WriteEndElement();
                    }

                    xmlWriter.WriteEndElement();
                    xmlWriter.WriteStartElement("Links");

                    foreach (var node in ptg.Nodes)
                    {
                        var targetId = Convert.ToString(node.Id);

                        foreach (var variable in node.Variables)
                        {
                            var sourceId = variable.Name;

                            xmlWriter.WriteStartElement("Link");
                            xmlWriter.WriteAttributeString("Source", sourceId);
                            xmlWriter.WriteAttributeString("Target", targetId);
                            xmlWriter.WriteEndElement();
                        }

                        var fieldsBySource = from e in node.Sources
                                             from s in e.Value
                                             group e.Key by s into g
                                             select g;

                        foreach (var g in fieldsBySource)
                        {
                            var sourceId = Convert.ToString(g.Key.Id);
                            var label    = DGMLSerializer.GetLabel(g);

                            xmlWriter.WriteStartElement("Link");
                            xmlWriter.WriteAttributeString("Source", sourceId);
                            xmlWriter.WriteAttributeString("Target", targetId);
                            xmlWriter.WriteAttributeString("Label", label);
                            xmlWriter.WriteEndElement();
                        }
                    }

                    xmlWriter.WriteEndElement();
                    xmlWriter.WriteStartElement("Styles");
                    xmlWriter.WriteStartElement("Style");
                    xmlWriter.WriteAttributeString("TargetType", "Node");

                    xmlWriter.WriteStartElement("Setter");
                    xmlWriter.WriteAttributeString("Property", "FontFamily");
                    xmlWriter.WriteAttributeString("Value", "Consolas");
                    xmlWriter.WriteEndElement();

                    xmlWriter.WriteStartElement("Setter");
                    xmlWriter.WriteAttributeString("Property", "NodeRadius");
                    xmlWriter.WriteAttributeString("Value", "5");
                    xmlWriter.WriteEndElement();

                    xmlWriter.WriteStartElement("Setter");
                    xmlWriter.WriteAttributeString("Property", "MinWidth");
                    xmlWriter.WriteAttributeString("Value", "0");
                    xmlWriter.WriteEndElement();

                    xmlWriter.WriteEndElement();
                    xmlWriter.WriteEndElement();
                    xmlWriter.WriteEndElement();
                    xmlWriter.Flush();
                    return(stringWriter.ToString());
                }
        }
示例#15
0
        public static ISet <PTGNode> GetTargets(this PointsToGraph ptg, InstanceFieldAccess access)
        {
            var result = ptg.GetTargets(access.Instance, access.Field);

            return(result);
        }