Exemplo n.º 1
0
        //traverse down a trace (List<Block>). At each program point:
        // -Write the new SymbolicStore at each AssignCmd.
        // -Write the guard condition for each AssumeCmd.
        //the latter will be overwritten by an ExecUp
        public static SymbolicTrace ExecDown(List <Block> bs, List <Variable> args)
        {
            SymbolicStore
                curStore = new SymbolicStore(),
                nextStore;

            ////initialize args with symbolic values
            List <Variable> symbolicConstants = new List <Variable>();

            for (int i = 0; i < args.Count; i++)
            {
                var v = args[i];
                symbolicConstants.Add(B.Factory.MakeConstant(v.Name, v.TypedIdent.Type));
                curStore.Add(new StoreLhs(v), Expr.Ident(symbolicConstants[i]));
            }

            var newTrace = new SymbolicTrace();

            foreach (Block b in bs)
            {
                var tmp = ExecBlockDown(b, curStore, out nextStore);
                newTrace.Add(ExecBlockDown(b, curStore, out nextStore));
                curStore = nextStore;
            }
            return(newTrace);
        }
Exemplo n.º 2
0
        public static Expr Resolve(Variable var, SymbolicStore store)
        {
            if (var == null || store == null)
            {
                return(null);
            }

            var resolver = new ExprResolver(store);
            var duper    = new Duplicator();
            var ret      = store.Get(new StoreLhs(var));

            if (ret == null)
            {
                Log.Out(Log.Error, "Could not find " + var.Name + " in symbolic store!");
                return(null);
            }

            ret = resolver.VisitExpr(ret);
            ret = duper.VisitExpr(ret);
            return(ret);
        }
Exemplo n.º 3
0
 public void AddGamma(SymbolicStore gamma)
 {
     Gammas.Add(gamma);
 }
Exemplo n.º 4
0
 public ExprResolver(SymbolicStore store)
 {
     this.Store = store;
 }
Exemplo n.º 5
0
 public SymbolicStore(SymbolicStore s)
     : base(s)
 {
 }
Exemplo n.º 6
0
        public static SymbolicBlock ExecBlockDown(Block b, SymbolicStore gammaIntoBlock, out SymbolicStore gammaOutOfBlock)
        {
            var duper = new Duplicator();
            var sb    = new SymbolicBlock(b);

            SymbolicStore gammaIntoCmd = gammaIntoBlock;

            foreach (Cmd c in b.Cmds)
            {
                var sc = new SymbolicCmd(c);
                if (c is AssumeCmd)
                {
                    if (!((AssumeCmd)c).Expr.Equals(Expr.True))
                    {
                        var tmp = ((AssumeCmd)c).Expr;
                        sc.AddCons(((AssumeCmd)c).Expr);
                    }
                }
                else if (c is AssignCmd)
                {
                    SymbolicStore newGamma; //= new SymbolicStore(gammaIntoCmd);

                    AssignCmd assgn = c as AssignCmd;
                    if (assgn.Lhss.Count != assgn.Rhss.Count)
                    {
                        Console.WriteLine("Bizzare: uneven assignment command in ExecDown");
                        continue;
                    }
                    //each AssignCmd contains a list of assignments
                    for (int i = 0; i < assgn.Lhss.Count; i++)
                    {
                        var lhsrhs = StoreLhs.Make(assgn.Lhss[i], assgn.Rhss[i]);
                        var lhs    = lhsrhs.fst;
                        var rhs    = lhsrhs.snd;

                        Expr oldrhs;
                        gammaIntoCmd.TryGetValue(lhs, out oldrhs);

                        //if lhs was uninitialized, we just add the new binding to the old gamma
                        if (oldrhs == null)
                        {
                            newGamma = new SymbolicStore(gammaIntoCmd);
                            newGamma.Add(lhs, rhs);
                        }
                        //otherwise we have to do substitution over everything
                        else
                        {
                            newGamma = new SymbolicStore();
                            newGamma.Add(lhs, Substituter.Apply(x => (x == lhs.Var) ? duper.VisitExpr(oldrhs) : null, rhs));

                            //otherwise, we need to substitute the old value for lhs into Gamma
                            foreach (var entry in gammaIntoCmd)
                            {
                                if (!entry.Key.Equals(lhs))
                                {
                                    newGamma.Add(entry.Key, Substituter.Apply(x => (x == lhs.Var) ? duper.VisitExpr(oldrhs) : null, entry.Value));
                                }
                            }
                        }
                        gammaIntoCmd = newGamma;
                        sc.AddGamma(newGamma);
                    }
                }
                else if (c is HavocCmd)
                {
                    Log.Out(Log.Warning, "Help! HavocCmd in ExecBlockDown!");
                }

                // if(sc.Gammas.Count != 0)
                sb.SCmds.Add(sc);
            }

            gammaOutOfBlock = gammaIntoCmd;
            return(sb);
        }