private int traceCreatedID(int seq) { for (int i = 0; i < traces.Count; i++) { CTrace cTrace = (CTrace)traces[i]; if (cTrace.seq == seq) { return(cTrace.id); } } Debug.LogError("(traceCreatedID) not found: " + seq); return(-1); }
private bool CheckTraces(int seq, int template) { if (template != 135 && template != 136) { return(true); } for (int i = 0; i < traces.Count; i++) { CTrace cTrace = (CTrace)traces[i]; if (cTrace.seq == seq) { return(true); } } if (template == 136) { bLastTarget = true; } return(false); }
private void EraseTrace(int eraseId) { int num = -1; for (int i = 0; i < traces.Count; i++) { CTrace cTrace = (CTrace)traces[i]; if (cTrace.id == eraseId) { num = i; break; } } if (num >= 0) { traces.RemoveAt(num); } else { Debug.LogError("(EraseTrace) not found: " + eraseId); } }
public static void ProcessCounterexamplesWOSymbolicOut(SDiffCounterexamples errors, List <Variable> globals, List <Variable> eqLocVars, Implementation vtLeftProcImpl, Implementation vtRightProcImpl, List <Declaration> consts, List <Model> errModelList, string v1Name, string v2Name) { List <Expr> constraintExprs = new List <Expr>(); List <Block> listBlocksV1 = new List <Block>(); List <Block> listBlocksV2 = new List <Block>(); Model[] errModelArray = errModelList.ToArray(); var label = new GotoCmd(Token.NoToken, new List <String>() { "DONE" }); label.labelNames = new List <string>(); // label.labelTargets = new List<Block>(); label.labelNames.Add("DONE"); //label.labelTargets.Add("DONE"); // First block var labels = new List <String>(); for (int j = 0; j < errors.Count; j++) { labels.Add("Cex" + j); } labels.Add("ELSE"); var labelEntry = new GotoCmd(Token.NoToken, labels); labelEntry.labelTargets = new List <Block>(); for (int j = 0; j < errors.Count; j++) { labelEntry.labelNames.Add("Cex" + j);//labelEntry.labelTargets.Add("Cex" + j); } for (int i = 0; i < errors.Count; i++) { var impl = errors[i].Impl; var trace = errors[i].Trace; //Log.Out(Log.Normal, "Attempting symbolic execution of [" + i + "] $ " + impl.Name); if (Options.GenerateCTrace) { Log.Out(Log.Normal, "Constructing metatrace from location annotations"); var extractor = new SDiff.SymEx.TraceExtractor(); extractor.VisitTrace(trace); //Log.Out(Log.CTrace, CTrace.Make(extractor.metaTrace)); var cTrace = CTrace.Make(extractor.metaTrace, consts, errModelArray[i], v1Name, v2Name); //var cTrace = ""; if (cTrace.Trim() != "") { //note that the index for cex on the output shows 1,2,..., instead of 0,1,2.... var fname = impl.Name + "_cex_" + (i + 1) + "_out.c"; var cexOut = new TokenTextWriter(impl.Name + "_cex_" + (i + 1) + "_out.c", true); cexOut.WriteLine(cTrace); cexOut.Close(); Log.Out(Log.CTrace, "n:" + (i + 1) + ":" + fname); Log.Out(Log.CTrace, "w:" + fname); } } Log.Out(Log.Normal, "Desugaring calls"); //HACK!!!: changes havoc x; assume (x= uf(..)); --> x := uf(...) var deCall = new SDiff.SymEx.DesugarCallCmds(); trace = deCall.VisitTrace(trace); //symbolic constants var symInParams = new List <Variable>(impl.InParams); foreach (var g in globals) { symInParams.Add(g); } Log.Out(Log.Normal, "Executing trace downward"); //symbolic stores (look at symex.cs for the datastructure) // var sTrace = SDiff.SymEx.Cexecutor.ExecDown(trace, symInParams); Log.Out(Log.Normal, "Executing trace upward"); //looks at each assume to create the path constants //clean up the duplication of assignments //SDiff.SymEx.Cexecutor.ExecUp(sTrace); Log.Out(Log.Normal, "Grabbing final execution values"); // var lastStore = sTrace.LastSCmd().Gammas.Last(); // var firstCons = sTrace.FirstSCmd().Cons; // constraintExprs.Add(firstCons.Conjoin()); //#hemr - generating new strategy right here with inlining counterexamples! // Second block List <Cmd> cmdsV1_Diff_inline = new List <Cmd>(); List <Cmd> cmdsV2_Diff_inline = new List <Cmd>(); Substitution replaceScopeV1 = delegate(Variable x) { return(replaceScopeGeneric(vtLeftProcImpl, x)); }; Substitution replaceScopeV2 = delegate(Variable x) { return(replaceScopeGeneric(vtRightProcImpl, x)); }; foreach (Block currentBlock in trace) { if (currentBlock.ToString().Contains("inline$" + v1Name)) { foreach (Cmd currentCmd in currentBlock.Cmds) { Cmd newCmd = Substituter.Apply(replaceScopeV1, currentCmd); cmdsV1_Diff_inline.Add(newCmd); } } else if (currentBlock.ToString().Contains("inline$" + v2Name)) { foreach (Cmd currentCmd in currentBlock.Cmds) { Cmd newCmd = Substituter.Apply(replaceScopeV2, currentCmd); cmdsV2_Diff_inline.Add(newCmd); } } } Block blockV1 = new Block(Token.NoToken, "Cex" + i, cmdsV1_Diff_inline, label); Block blockV2 = new Block(Token.NoToken, "Cex" + i, cmdsV2_Diff_inline, label); listBlocksV1.Add(blockV1); listBlocksV2.Add(blockV2); //#hemr - displaying values related to error model (at console level) Model currentModel = errModelArray[i]; //var keys = currentModel.identifierToPartition.Keys; var keys = currentModel.Functions.Where(f => f.Arity == 0).Select(f => f.GetConstant()); } Expr disjunctionDiffCond = Expr.False; foreach (Expr currentExpr in constraintExprs) { disjunctionDiffCond = Expr.Or(disjunctionDiffCond, currentExpr); } ProcessCounterexampleForDiffInliningWOSymbolicOut(eqLocVars, vtLeftProcImpl, vtRightProcImpl, v1Name, v2Name, listBlocksV1, listBlocksV2, labelEntry); }
public static void ProcessCounterexamples(SDiffCounterexamples errors, List <Variable> globals, List <Variable> outputVars, Program prog, Implementation vtLeftProcImpl, Implementation vtRightProcImpl) { List <Expr> constraintExprs = new List <Expr>(); for (int i = 0; i < errors.Count; i++) { var impl = errors[i].Impl; var trace = errors[i].Trace; Log.Out(Log.Normal, "Attempting symbolic execution of [" + (i + 1) + "] $ " + impl.Name); if (Options.GenerateCTrace) { Log.Out(Log.Normal, "Constructing metatrace from location annotations"); var extractor = new SDiff.SymEx.TraceExtractor(); extractor.VisitTrace(trace); //Log.Out(Log.CTrace, CTrace.Make(extractor.metaTrace)); var cTrace = CTrace.Make(extractor.metaTrace, null, null, "", ""); //var cTrace = ""; if (cTrace.Trim() != "") { var fname = impl.Name + "_cex_" + (i + 1) + "_out.c"; var cexOut = new TokenTextWriter(impl.Name + "_cex_" + (i + 1) + "_out.c", true); cexOut.WriteLine(cTrace); cexOut.Close(); Log.Out(Log.CTrace, "n:" + (i + 1) + ":" + fname); Log.Out(Log.CTrace, "w:" + fname); } } Log.Out(Log.Normal, "Desugaring calls"); //HACK!!!: changes havoc x; assume (x= uf(..)); --> x := uf(...) var deCall = new SDiff.SymEx.DesugarCallCmds(); trace = deCall.VisitTrace(trace); //symbolic constants var symInParams = new List <Variable>(impl.InParams); foreach (var g in globals) { symInParams.Add(g); } Log.Out(Log.Normal, "Executing trace downward"); //symbolic stores (look at symex.cs for the datastructure) var sTrace = SDiff.SymEx.Cexecutor.ExecDown(trace, symInParams); Log.Out(Log.Normal, "Executing trace upward"); //looks at each assume to create the path constants //clean up the duplication of assignments SDiff.SymEx.Cexecutor.ExecUp(sTrace); if (Options.DumpSymTrace) { SDiff.SymEx.CexDumper.PrintSymbolicTrace(sTrace); } //printing the symbolic stores at exit //still in SSA form Log.Out(Log.Normal, "Grabbing final execution values"); var lastStore = sTrace.LastSCmd().Gammas.Last(); var firstCons = sTrace.FirstSCmd().Cons; //resolves the outputs to be expressions over uif and symbolic constants only Log.Out(Log.Normal, "Resolving result expressions"); var outSymExprs = new List <Expr>(); foreach (var v in outputVars) { outSymExprs.Add(SymEx.ResolveSymExpr.Resolve(v, lastStore)); } Log.Out(Log.SymEx, "SymEx Results==================================="); Log.Out(Log.SymEx, "Input constraint"); if (Options.EraseUFArgumentsOnPrintout) // f(..) { var eraser = new ArgumentParameterEraser(); var duper = new Duplicator(); var dupConst = new SDiff.SymEx.Constraint(firstCons, true); foreach (var e in dupConst.Conjuncts) { eraser.VisitExpr(e); } Log.LogEmit(Log.SymEx, 1, dupConst.Emit); } else { Log.LogEmit(Log.SymEx, 1, firstCons.Emit); } constraintExprs.Add(firstCons.Conjoin()); Console.WriteLine(); Log.Out(Log.SymEx, "Symbolic output values"); var outSymExprsPrintable = outSymExprs; if (Options.EraseUFArgumentsOnPrintout) // f(..) { outSymExprsPrintable = new List <Expr>(); var eraser = new ArgumentParameterEraser(); var duper = new Duplicator(); foreach (Expr e in outSymExprs) { var ex = duper.VisitExpr(e); eraser.VisitExpr(ex); outSymExprsPrintable.Add(ex); } } //if the output variables aren't paired, iterate through normally if (outputVars.Count % 2 != 0) { for (int j = 0; j < outputVars.Count; j++) { Log.Out(Log.SymEx, "\t" + outputVars[j].ToString() + ": "); Log.LogEmit(Log.SymEx, 2, outSymExprsPrintable[j].Emit); Log.Out(Log.Normal, ""); } } //otherwise don't print a pair if it's syntactically equal else { for (int j = 0; j < outputVars.Count; j += 2) { if (!outSymExprs[j].StringEquals(outSymExprs[j + 1])) { Log.Out(Log.SymEx, "\t" + outputVars[j].ToString() + ": "); Log.LogEmit(Log.SymEx, 2, outSymExprsPrintable[j].Emit); Log.Out(Log.Normal, ""); Log.Out(Log.SymEx, "\t" + outputVars[j + 1].ToString() + ": "); Log.LogEmit(Log.SymEx, 2, outSymExprsPrintable[j + 1].Emit); Log.Out(Log.Normal, ""); } } } } Expr disjunctionDiffCond = Expr.False; if (Options.PropagateSingleDifference && errors.Count > 1) { var t = constraintExprs.First(); disjunctionDiffCond = Expr.Or(disjunctionDiffCond, constraintExprs.First()); } else { foreach (Expr currentExpr in constraintExprs) { disjunctionDiffCond = Expr.Or(disjunctionDiffCond, currentExpr); } } ProcessCounterexampleForDiffInline(errors, vtLeftProcImpl, vtRightProcImpl, disjunctionDiffCond); }