public override bool Analyze(IEnumerable <ResolvedMethod <Node> > starts) { var initialState = new UnknownEntity(); var emptyInvocation = new OperationEdge <Node>(0, new NopStatement(), 0); var initialStackData = new MyStackData(emptyInvocation, initialState, false); var pdvm = (MyPdvm)InternalSimulation.Pdvm; pdvm.SetForcedExecutor(InternalSimulation.ForceExecute); var contexts = starts.Select( start => InternalSimulation.Load(start.Start, initialState, initialStackData)).ToList(); InternalSimulation.Run(); return(true); }
public override IEnumerable <IEnumerable <Statement> > Analyze(IEnumerable <ResolvedMethod <Node> > starts) { var initialContexts = new List <PdaExtractingContext <GssNode <TStackSymbol, EmptyGssData>, OperationEdge <Node> > >(); var finalContexts = new List <PdaExtractingContext <GssNode <TStackSymbol, EmptyGssData>, OperationEdge <Node> > >(); foreach (var start in starts) { var context = InternalSimulation.Load(start.EntryPoint, InitialState, InitialStackSymbol); initialContexts.Add(context); } var pdvm = (ILProcessingPDVM <TState, TStackSymbol>)InternalSimulation.Pdvm; pdvm.OnFinishEvent += context => finalContexts.Add(context); InternalSimulation.Run(); var finalContextSet = finalContexts.ToHashSet(); var results = new List <IEnumerable <Statement> >(); foreach (var initialContext in initialContexts) { PdaContextDecoder.ExtractWords( initialContext, context => finalContextSet.Contains(context), 0, word => { results.Add(word.Select(symbol => symbol?.Statement)); return(true); }, _ => { }); } return(results.Select(FormatTrace)); }