예제 #1
0
                public override TDomain Assert(APC pc, EdgeTag tag, TVar condition, TDomain data)
                {
                    var boxed = ToBoxedExpression(pc, condition);

                    bool result;

                    if (boxed.IsTrivialCondition(out result))
                    {
                        return(result ? data : data.Bottom);
                    }

                    data = data.AssumeTrue(boxed);

                    var type =
                        ContextProvider.ValueContext.GetType(
                            ContextProvider.MethodContext.CFG.Post(pc), condition);

                    if (type.IsNormal() &&
                        MetaDataProvider.Equal(type.Value, MetaDataProvider.System_Boolean))
                    {
                        var guard =
                            BoxedExpression.Binary(BinaryOperator.Ceq, boxed,
                                                   BoxedExpression.Const(1,
                                                                         MetaDataProvider.
                                                                         System_Int32));

                        data = data.AssumeTrue(guard);
                    }

                    return(data);
                }
예제 #2
0
        public ExpressionType TypeOf(TExpr expr)
        {
            if (IsConstant(expr))
            {
                return(ExpressionContext.Decode <Dummy, ExpressionType, VisitorForTypeOf> (expr, type_of, Dummy.Value));
            }

            var abstractType = ExpressionContext.GetType(expr);

            if (abstractType.IsNormal())
            {
                var type = abstractType.Value;

                if (MetaDataProvider.IsPrimitive(type))
                {
                    if (MetaDataProvider.Equal(type, MetaDataProvider.System_Int32))
                    {
                        return(ExpressionType.Int32);
                    }
                    if (MetaDataProvider.Equal(type, MetaDataProvider.System_Single))
                    {
                        return(ExpressionType.Float32);
                    }
                    if (MetaDataProvider.Equal(type, MetaDataProvider.System_Double))
                    {
                        return(ExpressionType.Float64);
                    }
                    if (MetaDataProvider.Equal(type, MetaDataProvider.System_Boolean))
                    {
                        return(ExpressionType.Bool);
                    }
                }
            }

            return(ExpressionType.Unknown);
        }
예제 #3
0
                public override TDomain Assume(APC pc, EdgeTag tag, TVar condition, TDomain data)
                {
                    var boxed = ToBoxedExpression(pc, condition);

                    if (tag != EdgeTag.False)
                    {
                        bool value;
                        if (boxed.IsTrivialCondition(out value))
                        {
                            return(!value ? data.Bottom : data);
                        }
                    }

                    List <int> thresholds;

                    if (ThresholdDB.TryGetAThreshold(boxed, expression_decoder, out thresholds))
                    {
                        ThresholdDB.Add(thresholds);
                    }

                    TDomain result;

                    switch (tag)
                    {
                    case EdgeTag.True:
                    case EdgeTag.Requires:
                    case EdgeTag.Assume:
                    case EdgeTag.Invariant:
                        result = data.AssumeTrue(boxed);
                        break;

                    case EdgeTag.False:
                        result = data.AssumeFalse(boxed);
                        break;

                    default:
                        result = data;
                        break;
                    }

                    if (tag != EdgeTag.False)
                    {
                        var abstractType =
                            ContextProvider.ValueContext.GetType(
                                ContextProvider.MethodContext.CFG.Post(pc), condition);
                        if (abstractType.IsNormal() &&
                            MetaDataProvider.Equal(abstractType.Value,
                                                   MetaDataProvider.System_Boolean))
                        {
                            var guard =
                                BoxedExpression.Binary(BinaryOperator.Ceq, boxed,
                                                       BoxedExpression.Const(1,
                                                                             MetaDataProvider
                                                                             .
                                                                             System_Int32));

                            result = result.AssumeTrue(guard);
                        }
                    }

                    return(result);
                }