private void BindCallerReadEffects(PointsToAndWriteEffects calleePTWE, Label lb, InterProcMapping ipm) { foreach (AField af in calleePTWE.readEffects) { // Get the related caller's nodes foreach (IPTAnalysisNode n in ipm.RelatedExtended(af.Src)) { if (IsVisibleEffect(n, af.Field)) { readEffects.AddEffect(n, af.Field, lb); } allReadEffects.AddEffect(n, af.Field, lb); } } }
/* This was related with the old way of dealing with non analyzable calls private void RegisterModifiesInReachableObjects(Variable v, Label lb, bool confined) { // Use Filters for !owned!!!!!! Nodes reachables = PointsToGraph.NodesForwardReachableFromVariable(v, confined); foreach (IPTAnalysisNode n in reachables) { //if (n is LValueNode || n.IsGlobal) if(n.IsObjectAbstraction) { RegisterWriteEffect(n, PTGraph.allFields, lb,false); } } } private void RegisterReadInReachableObjects(Variable v, Label lb, bool confined) { // Use Filters for !owned!!!!!! Nodes reachables = PointsToGraph.NodesForwardReachableFromVariable(v,confined); foreach (IPTAnalysisNode n in reachables) { // Add Filters!!!!!! //if (n is LValueNode || n.IsGlobal) if (n.IsObjectAbstraction) { RegisterReadEffect(n, PTGraph.allFields, lb); } } } */ /// <summary> /// Apply the inter-procedural analysis, binding information from caller and callee /// </summary> /// <param name="vr"></param> /// <param name="callee"></param> /// <param name="receiver"></param> /// <param name="arguments"></param> /// <param name="calleePTWE"></param> /// <param name="lb"></param> /// public override void ApplyAnalyzableCall(Variable vr, Method callee, Variable receiver, ExpressionList arguments, PointsToState calleecState, Label lb, out InterProcMapping ipm) { if (this.method.FullName.Contains("Count")) { if (callee.Name.Name.Contains("Reverse")) { } if (callee.Name.Name.Contains("Dispose")) { } } if (callee.Name.Name.Contains("MoveNext2")) { } base.ApplyAnalyzableCall(vr, callee, receiver, arguments, calleecState, lb, out ipm); PointsToAndWriteEffects calleePTWE = (PointsToAndWriteEffects)calleecState; // Join the set of non-analyzable calls joinCalledMethod(callToNonAnalyzableMethods, calleePTWE.callToNonAnalyzableMethods); // For each write effect in the calee foreach (AField af in calleePTWE.writeEffects) { // Get the related caller's nodes foreach (IPTAnalysisNode n in ipm.RelatedExtended(af.Src)) { if (IsVisibleEffect(n, af.Field)) { writeEffects.AddEffect(n, af.Field, lb); } allWriteEffects.AddEffect(n, af.Field, lb); } } BindCallerReadEffects(calleePTWE, lb, ipm); }