public AlternativeDependencyAnalyzer(CFGNode cfgNode, PointsToGraph ptg, AlternativeDependencyAnalysis depAnalysis) { this.cfgNode = cfgNode; this.ptg = ptg; this.depAnalysis = depAnalysis; }
public static IEnumerable <PTGNode> GetReachableNodes(this PointsToGraph ptg) { var result = ptg.Variables.SelectMany(v => ptg.GetReachableNodes(v)) .Distinct(); return(result); }
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()); }
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()); }
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()); }
public static void RemoveTemporalVariables(this PointsToGraph ptg) { var temporals = ptg.Variables.OfType <TemporalVariable>().ToArray(); foreach (var temporal in temporals) { ptg.Remove(temporal); } }
public static void RemoveTemporalVariables(this PointsToGraph ptg) { foreach (var variable in ptg.Variables) { if (variable.IsTemporal()) { ptg.Remove(variable); } } }
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); }
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); }
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); } } } } }
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); }
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); } }
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); }
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()); } }
public static ISet <PTGNode> GetTargets(this PointsToGraph ptg, InstanceFieldAccess access) { var result = ptg.GetTargets(access.Instance, access.Field); return(result); }