private void ComputePairAccesses() { Console.WriteLine("EP: " + this.EP.Name); foreach (var pairEp in this.PairEntryPoints) { Console.WriteLine("pair: " + pairEp.Name); var otherAc = AnalysisContext.GetAnalysisContext(pairEp); var pairRegion = AnalysisContext.GetPairAnalysisContext(this.EP, pairEp); var otherRegion = otherAc.InstrumentationRegions.Find(val => val.Implementation().Name.Equals(pairEp.Name)); var accessMatch = new Dictionary <string, Expr>(); var ep1Accesses = new HashSet <string>(); foreach (var resource in this.Region.GetResourceAccesses()) { foreach (var access in resource.Value) { Expr a = null; pairRegion.TryGetMatchedAccess(this.EP, access, out a); ep1Accesses.Add(a.ToString()); accessMatch.Add(a.ToString(), access); } } if (ep1Accesses.Count == 0) { return; } var ep2Accesses = new HashSet <string>(); foreach (var resource in otherRegion.GetResourceAccesses()) { foreach (var access in resource.Value) { Expr a = null; pairRegion.TryGetMatchedAccess(pairEp, access, out a); ep2Accesses.Add(a.ToString()); } } if (ep2Accesses.Count == 0) { continue; } var intersection = new HashSet <string>(ep1Accesses.Intersect(ep2Accesses)); foreach (var access in intersection) { this.PairAccesses.Add(accessMatch[access]); } } foreach (var access in this.PairAccesses) { Console.WriteLine(" >>> pair: " + access); } Console.WriteLine("\n----\n"); }
public PairCheckingRegion(AnalysisContext ac, EntryPoint ep1, EntryPoint ep2) { Contract.Requires(ac != null && ep1 != null && ep2 != null); this.AC = ac; this.RegionName = "check$" + ep1.Name + "$" + ep2.Name; this.EP1 = ep1; this.EP2 = ep2; this.CheckCounter = 0; this.RegionBlocks = new List <Block>(); this.InParamMatcher = new Dictionary <int, Variable>(); this.InParamMapEP1 = new Dictionary <string, IdentifierExpr>(); this.InParamMapEP2 = new Dictionary <string, IdentifierExpr>(); this.AC1 = AnalysisContext.GetAnalysisContext(ep1); this.AC2 = AnalysisContext.GetAnalysisContext(ep2); Implementation impl1 = this.AC1.GetImplementation(ep1.Name); Implementation impl2 = this.AC2.GetImplementation(ep2.Name); this.CreateInParamMatcher(impl1, impl2); this.CreateImplementation(impl1, impl2); this.CreateProcedure(impl1, impl2); this.CreateInParamCache(impl1, impl2); this.CheckAndRefactorInParamsIfEquals(); this.RegionHeader = this.CreateRegionHeader(); }
private void UpdateInParamMap(Dictionary <string, Dictionary <Variable, int> > inParamMap, EntryPoint ep, PairCheckingRegion pairRegion) { var ac = AnalysisContext.GetAnalysisContext(ep); var region = ac.InstrumentationRegions.Find(val => val.Implementation().Name.Equals(ep.Name)); foreach (var resource in region.GetResourceAccesses()) { if (!inParamMap.ContainsKey(resource.Key)) { inParamMap.Add(resource.Key, new Dictionary <Variable, int>()); } foreach (var access in resource.Value) { Expr a = null; if (!pairRegion.TryGetMatchedAccess(ep, access, out a)) { continue; } IdentifierExpr id = null; var num = 0; if (a is NAryExpr) { id = (a as NAryExpr).Args[0] as IdentifierExpr; num = ((a as NAryExpr).Args[1] as LiteralExpr).asBigNum.ToInt; } else if (a is IdentifierExpr) { id = a as IdentifierExpr; } var inParam = pairRegion.Procedure().InParams.Find(val => val.Name.Equals(id.Name)); if (inParam == null) { continue; } if (!inParamMap[resource.Key].ContainsKey(inParam)) { inParamMap[resource.Key].Add(inParam, num); } else if (inParamMap[resource.Key][inParam] < num) { inParamMap[resource.Key][inParam] = num; } } } }