예제 #1
0
        private static void RunDependencyAnalysis(Program program, DependencyVisitor visitor, string kind, bool printTaint = false)
        {
            visitor.Visit(program);
            var deps = visitor.ProcDependencies;

            if (printTaint && changeLog.Count > 0)
            {
                // extract taint from dependencies and print
                var taintedBlocks = Utils.ExtractTaint(visitor);
                program.Implementations.Iter(impl => PopulateTaintLog(impl, taintedBlocks));
            }

            if (Prune)
            {
                Utils.DependenciesUtils.PruneProcDependencies(program, deps);
            }

            program.Implementations.Iter(impl => PopulateDependencyLog(impl, deps[impl.Proc], kind));

            //if (changeLog.Count > 0)
            // remove the special taint var
            //deps.Values.Iter(dep => dep.Values.Iter(d => { d.Remove(Utils.VariableUtils.BottomUpTaintVar); d.Remove(Utils.VariableUtils.TopDownTaintVar); }));

            if (PrintStats)
            {
                program.Implementations.Iter(impl => deps[impl.Proc].Iter(dep => PopulateStatsLog(kind, impl, dep.Key, dep.Value)));
            }
        }
예제 #2
0
파일: Worklist.cs 프로젝트: liyistc/symdiff
        internal void RunFixedPoint(DependencyVisitor visitor, Implementation node)
        {
            Dictionary <Absy, int> visitCount = new Dictionary <Absy, int>();
            //VarSet.allSets.Clear();
            Absy entry = Utils.GetImplEntry(node);

            workList.Add(entry);
            cmdBlocks[entry] = node.Blocks[0];
            while (workList.Count > 0)
            {
                var cmd = workList[0];
                workList.RemoveAt(0);
//#if DBG
                if (!visitCount.Keys.Contains(cmd))
                {
                    visitCount[cmd] = 0;
                }
                ++visitCount[cmd];
                //Console.WriteLine("Visiting (" + visitCount[cmd] + ") L" + cmd.Line + ": " + cmd);
//#endif
                //if (cmd is ReturnCmd || visitCount[cmd] <= 1)
                //if (visitCount[cmd] < 5)
                visitor.Visit(cmd);
                //else
                //{
                //    stateSpace[cmd].SetTop(node);
                //    if (!(cmd is ReturnCmd))
                //        Propagate(cmd);
                //}
                //else
                //SimpleTransform(cmd);
                //Console.WriteLine("State size is {0} (over {1} program locations)", stateSpace.Sum(s => (s.Value as Dependencies).Sum(vd => vd.Value.Count)), stateSpace.Keys.Count);
#if DBG
                if (stateSpace.ContainsKey(cmd))
                {
                    Console.WriteLine(stateSpace[cmd].ToString());
                }
                Console.ReadLine();
#endif
            }
            //HashSet<Dependencies> deps = new HashSet<Dependencies>();
            //int redundant = 0, overall = 0;
            //stateSpace.Values.Iter(d => { var dd = d as Dependencies; if (!deps.Add(dd)) redundant++; });
            //Console.WriteLine("{0} redundant dependiences in {1} locations", redundant, stateSpace.Keys.Count);
            //HashSet<VarSet> sets = new HashSet<VarSet>();
            //stateSpace.Values.Iter(d => (d as Dependencies).Values.Iter(s => { overall++; if (sets.Any(ss => ss.SetEquals(s))) redundant++; sets.Add(s); }));
            //Console.WriteLine("{0} redundant var sets out of {1}, size of allsets = {2}", redundant, overall, VarSet.allSets.Count);
        }
예제 #3
0
        private static void RunReadSetAnalysis(Program program, ProcReadSetVisitor rsVisitor, DependencyVisitor depVisitor = null)
        {
            rsVisitor.Visit(program);
            // prune
            if (Prune)
            {
                rsVisitor.ProcReadSet.Keys.Iter(p => Utils.VariableUtils.PruneLocals(program.Implementations.SingleOrDefault(i => i.Proc.Name == p.Name), rsVisitor.ProcReadSet[p]));
            }

            // create a dependency set \foreach r \in ReadSet: r <- ReadSet
            Dictionary <Procedure, Dependencies> rsProcDeps = new Dictionary <Procedure, Dependencies>();

            rsVisitor.ProcReadSet.Keys.Iter(p => { rsProcDeps[p] = new Dependencies(); rsVisitor.ProcReadSet[p].Iter(r => rsProcDeps[p][r] = rsVisitor.ProcReadSet[p]); });

            // print
            program.Implementations.Iter(impl => PopulateDependencyLog(impl, rsProcDeps[impl.Proc], Utils.StatisticsHelper.ReadSet));

            // taint
            if (changeLog.Count > 0)
            {
                depVisitor.ProcDependencies = rsProcDeps;
                depVisitor.Visit(program); // reminder: taint is essentially a dependecy analysis
                // extract taint from dependencies and print
                program.Implementations.Iter(impl => PopulateTaintLog(impl, Utils.ExtractTaint(depVisitor)));
                // remove the special taint var
                rsProcDeps.Values.Iter(dep => dep.Values.Iter(d => { d.Remove(Utils.VariableUtils.BottomUpTaintVar); d.Remove(Utils.VariableUtils.TopDownTaintVar); }));
            }

            // stats
            if (PrintStats)
            {
                rsVisitor.ProcReadSet.Iter(prs =>
                {
                    var proc = prs.Key; var readSet = prs.Value;
                    var impl = program.Implementations.SingleOrDefault(i => i.Proc.Name == proc.Name);
                    if (impl != null) // conservatively each output\global is dependent on all of the readset
                    {
                        readSet.Where(v => v is GlobalVariable || impl.OutParams.Contains(v) ||
                                      /* just to be safe: */ proc.OutParams.Contains(v)).Iter(v => PopulateStatsLog(Utils.StatisticsHelper.ReadSet, impl, v, readSet));
                    }
                });
            }
        }
예제 #4
0
        private static void RunRefinedDepAnalysis(string filename, Program program, Dictionary <Procedure, Dependencies> lowerBound, Dictionary <Procedure, Dependencies> upperBound)
        {
            //turn asserts/requires/ensures to free counterparts (assume/free req/free ens)
            //removing it from dependncy main path, as it screws up later analysis that just needs the dependency
            Utils.StripContracts(program);

            // remove the special taint var
            lowerBound.Values.Iter(dep => dep.Values.Iter(d => { d.Remove(Utils.VariableUtils.BottomUpTaintVar); d.Remove(Utils.VariableUtils.TopDownTaintVar); }));
            upperBound.Values.Iter(dep => dep.Values.Iter(d => { d.Remove(Utils.VariableUtils.BottomUpTaintVar); d.Remove(Utils.VariableUtils.TopDownTaintVar); }));

            var refineDepsWL = new RefineDependencyWL(filename, program, lowerBound, upperBound, StackBound);

            Utils.LogStopwatch(sw, "Initial analysis", Analysis.Timeout);
            refineDepsWL.RunFixedPoint(sw);
            Utils.LogStopwatch(sw, "After refined dependency analysis", Analysis.Timeout);
            // print
            refineDepsWL.currDependencies.Iter(pd => PopulateDependencyLog(program.Implementations.SingleOrDefault(i => i.Proc.Name == pd.Key.Name), pd.Value, Utils.StatisticsHelper.Refined));

            // stats
            refineDepsWL.currDependencies.Iter(pd =>
            {
                var impl = program.Implementations.SingleOrDefault(i => i.Proc.Name == pd.Key.Name);
                if (impl != null)
                {
                    pd.Value.Iter(dep => PopulateStatsLog(Utils.StatisticsHelper.Refined, impl, dep.Key, dep.Value));
                }
            });

            //taint
            if (changeLog.Count > 0)
            {
                DependencyVisitor visitor = new DependencyVisitor(filename, program, changeLog, Timeout);
                visitor.ProcDependencies = refineDepsWL.currDependencies;
                visitor.Visit(program); // reminder: taint is essentially a dependecy analysis
                // extract taint from dependencies and print
                program.Implementations.Iter(impl => PopulateTaintLog(impl, Utils.ExtractTaint(visitor)));
            }
        }