Esempio n. 1
0
        /// <summary>
        /// Model check an expression to find inputs that lead to it being false.
        /// </summary>
        /// <param name="expression">The expression.</param>
        /// <returns>
        ///     Assignment to zen arbitrary variables that make the expression false.
        ///     Null if no such assignment exists.
        /// </returns>
        public Dictionary <object, object> ModelCheck(Zen <bool> expression)
        {
            var symbolicEvaluator = new SymbolicEvaluationVisitor <TModel, TVar, TBool, TInt>(solver);
            var env            = new SymbolicEvaluationEnvironment <TModel, TVar, TBool, TInt>();
            var symbolicResult =
                (SymbolicBool <TModel, TVar, TBool, TInt>)expression.Accept(symbolicEvaluator, env);

            // Console.WriteLine($"[time] model checking: {watch.ElapsedMilliseconds}ms");
            // watch.Restart();

            var possibleModel = solver.Satisfiable(symbolicResult.Value);

            // Console.WriteLine($"[time] get sat: {watch.ElapsedMilliseconds}ms");

            if (!possibleModel.HasValue)
            {
                return(null);
            }

            var model = possibleModel.Value;

            // compute the input given the assignment
            var arbitraryAssignment = new Dictionary <object, object>();

            foreach (var kv in symbolicEvaluator.ArbitraryVariables)
            {
                var expr     = kv.Key;
                var variable = kv.Value;
                arbitraryAssignment.Add(expr, this.solver.Get(model, variable));
            }

            return(arbitraryAssignment);
        }
Esempio n. 2
0
        /// <summary>
        /// Model check an expression to find inputs that lead to it being false.
        /// </summary>
        /// <param name="expression">The expression.</param>
        /// <returns>
        ///     Assignment to zen arbitrary variables that make the expression false.
        ///     Null if no such assignment exists.
        /// </returns>
        public Dictionary <object, object> ModelCheck(Zen <bool> expression)
        {
            var symbolicEvaluator = new SymbolicEvaluationVisitor <TModel, TVar, TBool, TBitvec, TInt, TString>(solver);
            var env            = new SymbolicEvaluationEnvironment <TModel, TVar, TBool, TBitvec, TInt, TString>();
            var symbolicResult =
                (SymbolicBool <TModel, TVar, TBool, TBitvec, TInt, TString>)expression.Accept(symbolicEvaluator, env);

            var possibleModel = solver.Satisfiable(symbolicResult.Value);

            if (!possibleModel.HasValue)
            {
                return(null);
            }

            var model = possibleModel.Value;

            // compute the input given the assignment
            var arbitraryAssignment = new Dictionary <object, object>();

            foreach (var kv in symbolicEvaluator.ArbitraryVariables)
            {
                var expr     = kv.Key;
                var variable = kv.Value;
                var type     = expr.GetType().GetGenericArguments()[0];
                var obj      = this.solver.Get(model, variable);

                if (ReflectionUtilities.IsFixedIntegerType(type))
                {
                    obj = type.GetConstructor(new Type[] { typeof(byte[]) }).Invoke(new object[] { obj });
                }

                arbitraryAssignment.Add(expr, obj);
            }

            return(arbitraryAssignment);
        }