Esempio n. 1
0
 protected override void OnVariableAssignmentRetracted(
     FlowVariable variable,
     int assignedVersion,
     Expression value)
 {
     this.AddVariableValue(new VersionedVariable(variable, assignedVersion));
 }
Esempio n. 2
0
        public T this[FlowVariable variable]
        {
            get
            {
                var localVariable = variable as LocalFlowVariable;
                if (localVariable != null)
                {
                    return(this[localVariable]);
                }
                else
                {
                    return(this[(GlobalFlowVariable)variable]);
                }
            }

            set
            {
                var localVariable = variable as LocalFlowVariable;
                if (localVariable != null)
                {
                    this[localVariable] = value;
                }
                else
                {
                    this[(GlobalFlowVariable)variable] = value;
                }
            }
        }
Esempio n. 3
0
        public Assignment(FlowVariable variable, Expression value)
        {
            Contract.Requires <ArgumentNullException>(variable != null, nameof(variable));
            Contract.Requires <ArgumentNullException>(value != null, nameof(value));
            Contract.Requires <ArgumentException>(value.Sort == variable.Sort, nameof(value));

            this.Variable = variable;
            this.Value    = value;
        }
        private void AssertEquals(FlowVariable variable, int version, Expression value)
        {
            var symbolName    = this.SmtContextHandler.GetVariableVersionSymbol(variable, version);
            var symbolWrapper = ExpressionFactory.NamedVariable(variable.Sort, symbolName);

            var equal = (BoolHandle)ExpressionFactory.Equal(symbolWrapper, value);

            this.smtSolver.AddAssertion(this.NameProvider, equal);
        }
Esempio n. 5
0
        protected FieldOperation(FlowVariable reference, IFieldDefinition field)
        {
            Contract.Requires(reference != null, nameof(reference));
            Contract.Requires(field != null, nameof(field));
            Contract.Requires(reference.IsReference, nameof(reference));

            this.Reference = reference;
            this.Field     = field;
        }
Esempio n. 6
0
        public FieldRead(FlowVariable resultStore, FlowVariable reference, IFieldDefinition field)
            : base(reference, field)
        {
            Contract.Requires <ArgumentNullException>(resultStore != null, nameof(resultStore));
            Contract.Requires <ArgumentNullException>(reference != null, nameof(reference));
            Contract.Requires <ArgumentNullException>(field != null, nameof(field));
            Contract.Requires <ArgumentException>(reference.IsReference, nameof(reference));
            Contract.Requires <ArgumentException>(resultStore.Sort == field.Sort, nameof(resultStore));

            this.ResultStore = resultStore;
        }
Esempio n. 7
0
        private void NewVariableRelayCommand(object parameter)
        {
            var lastVariable = Variables.OrderBy(x => x.Name).LastOrDefault();
            var newVariable  = new FlowVariable
            {
                Name = lastVariable != null ? lastVariable.Name + "(Copy)" : "New Variable",
                Type = typeof(string)
            };

            Variables.Add(newVariable);
        }
Esempio n. 8
0
        public FieldWrite(FlowVariable reference, IFieldDefinition field, Expression value)
            : base(reference, field)
        {
            Contract.Requires <ArgumentNullException>(reference != null, nameof(reference));
            Contract.Requires <ArgumentNullException>(field != null, nameof(field));
            Contract.Requires <ArgumentNullException>(value != null, nameof(value));
            Contract.Requires <ArgumentException>(reference.IsReference, nameof(reference));
            Contract.Requires <ArgumentException>(value.Sort == field.Sort, nameof(value));

            this.Value = value;
        }
Esempio n. 9
0
 public int GetVariableVersion(FlowVariable variable)
 {
     // TODO: Consider turning null into a global variable to avoid this check
     if (variable == References.Null)
     {
         return(VersionedVariable.Null.Version);
     }
     else
     {
         return(this.variableVersions[variable].CurrentVersion);
     }
 }
Esempio n. 10
0
        public static bool IsReferenceComparison(
            Expression expr,
            out bool areEqual,
            out FlowVariable left,
            out FlowVariable right)
        {
            if ((expr?.Kind == ExpressionKind.Equal || expr?.Kind == ExpressionKind.Distinct) &&
                expr.GetChild(0).Sort == Sort &&
                expr.GetChild(0) is FlowVariable leftVar &&
                expr.GetChild(1) is FlowVariable rightVar)
            {
                Contract.Assert(expr.Sort == Sort.Bool);
                Contract.Assert(expr.GetChild(1).Sort == Sort);

                areEqual = (expr.Kind == ExpressionKind.Equal);
                left     = leftVar;
                right    = rightVar;

                return(true);
            }
Esempio n. 11
0
        internal SymbolName GetVariableVersionSymbol(FlowVariable variable, int version)
        {
            Contract.Requires(variable != null);
            Contract.Requires(version >= 0);

            var versionsList = this.variableVersionSymbols[variable];

            for (int i = versionsList.Count; i <= version; i++)
            {
                // TODO: Make configurable without the dependence on the Debug/Release configuration
#if DEBUG
                var symbolName = new SymbolName($"{variable.ToString()}_{version}", this.lastVariableNumber);
#else
                var symbolName = new SymbolName(null, this.lastVariableNumber);
#endif
                this.lastVariableNumber++;
                versionsList.Add(symbolName);
            }

            return(versionsList[version]);
        }
        protected override void OnVariableAssigned(
            FlowVariable variable,
            int lastVersion,
            Expression value)
        {
            if (variable.IsReference)
            {
                var leftRef  = new VersionedVariable(variable, lastVersion);
                var rightRef = this.GetVersioned((FlowVariable)value);

                this.Heap.AssignReference(leftRef, rightRef);
            }
            else if (References.IsReferenceComparison(value, out bool areEqual, out var left, out var right))
            {
                var varLeft  = this.GetVersioned(left);
                var varRight = this.GetVersioned(right);
                value = this.Heap.GetEqualityExpression(areEqual, varLeft, varRight);
            }

            if (!variable.IsReference)
            {
                this.AssertEquals(variable, lastVersion, value);
            }
        }
Esempio n. 13
0
 public VersionedVariable(FlowVariable variable, int version)
 {
     this.Variable = variable;
     this.Version  = version;
 }
Esempio n. 14
0
 protected override void OnRandomVariableRetracted(FlowVariable variable, int version)
 {
     this.AddVariableValue(new VersionedVariable(variable, version));
 }
Esempio n. 15
0
            public VersionedVariable GetVersioned(FlowVariable variable)
            {
                int version = this.owner.pathConditionHandler.GetVariableVersion(variable);

                return(new VersionedVariable(variable, version));
            }
Esempio n. 16
0
        public VersionedVariable GetVersioned(FlowVariable variable)
        {
            int version = this.GetVariableVersion(variable);

            return(new VersionedVariable(variable, version));
        }