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");
        }
Beispiel #2
0
        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;
                    }
                }
            }
        }